对于所有帮助者,我想在我的整个 Rails 应用程序中替换以下语法:
time_ago_in_words(@from_time)
有了这个:
@from_time.time_ago_in_words
理想情况下,此更改还将使助手在我的应用程序中的任何位置都可用(例如,相同的方式5.times
)。
有谁知道这样做的插件?自己动手会不会很困难?
对于所有帮助者,我想在我的整个 Rails 应用程序中替换以下语法:
time_ago_in_words(@from_time)
有了这个:
@from_time.time_ago_in_words
理想情况下,此更改还将使助手在我的应用程序中的任何位置都可用(例如,相同的方式5.times
)。
有谁知道这样做的插件?自己动手会不会很困难?
如果您创建一个新模型,您可以使其继承现有类的方法。
示例(app/models/mykindofstring.rb):
class Mykindofstring < String
def all_caps_and_reverse
self.upcase.reverse
end
end
然后从控制器:
@my_string = Mykindofstring.new('This is my string')
最后从视图中调用它:
<%= @my_string %>
显示为这是我的字符串,而:
<%= @my_string.all_caps_and_reverse %>
显示为 GNIRTS YM SI SIHT。
该类继承自字符串类,因此适用于字符串的所有方法也适用于 mykindofstring 对象。其中的方法只是两个现有字符串方法组合的新名称,但您可以让它做任何您想做的事情,例如将时间转换为格式化字符串的方法。
基本上它只是用你自己的方法扩展一个当前的 Ruby 类,而不是使用函数/帮助器。
主要编辑
基于 Ians 对此答案的评论和他自己对上述问题的回答,我在 Rails 中进行了一些尝试,并想出将其添加到 application_helper.rb 中:
module ApplicationHelper
String.class_eval do
def all_caps_and_reverse
self.upcase.reverse
end
end
end
现在只需在应用程序中的任何字符串上调用该方法:
@string = 'This is a string.'
@string.all_caps_and_reverse
.gnirts a si sihT
对于所有(或什至大多数)助手,您不会在整个应用程序中找到任何简单的方法来执行此操作。
帮助程序被构造为旨在包含在视图呈现类中的模块。要利用它们,您必须保留一个 ActionView 的副本(我想这不是一笔大买卖)。
但是,您始终可以打开类并指定所需的每个助手:
class Time
def time_ago_in_words
ActionView::Base.new.time_ago_in_words self
end
end
>> t = Time.now
=> Tue May 12 10:54:07 -0400 2009
>> t.time_ago_in_words
=> "less than a minute"
(wait a minute)
>> t.time_ago_in_words
=> "1 minute"
如果您采用这种方法,我建议缓存您使用的 ActionView::Base 实例。或者,如果你不想变得如此重量级,你可以创建自己的类来只包含你想要的帮助器(你不想直接在每个时间、日期、字符串等类中包含帮助器,尽管,因为这会使方法命名空间非常混乱——并且与您想要的自然名称冲突)。
如果您使用的是 Ruby 2.1,则可以使用 Refinements。它们是猴子修补 Ruby 类的替代方案。借用@Jarrod 的猴子补丁示例:
module MyString
refine String do
def all_caps_and_reverse
upcase.reverse
end
end
end
您现在可以在任何您想要的对象中使用它:
class Post
using MyString
end
@post.title.all_caps_and_reverse
您可以在此处阅读有关细化的更多信息。
制作一个模型,TimeAgo 或类似的东西。在此处实现以下想法: “文字化”数字的代码片段
然后,在您的控制器中,使用此类创建实例变量。然后,在您看来,请致电@from_time.in_words