1

对于所有帮助者,我想在我的整个 Rails 应用程序中替换以下语法:

time_ago_in_words(@from_time)

有了这个:

@from_time.time_ago_in_words

理想情况下,此更改还将使助手在我的应用程序中的任何位置都可用(例如,相同的方式5.times)。

有谁知道这样做的插件?自己动手会不会很困难?

4

4 回答 4

4

如果您创建一个新模型,您可以使其继承现有类的方法。

示例(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

于 2009-05-12T03:52:13.037 回答
1

对于所有(或什至大多数)助手,您不会在整个应用程序中找到任何简单的方法来执行此操作。

帮助程序被构造为旨在包含在视图呈现类中的模块。要利用它们,您必须保留一个 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 实例。或者,如果你不想变得如此重量级,你可以创建自己的类来只包含你想要的帮助器(你不想直接在每个时间、日期、字符串等类中包含帮助器,尽管,因为这会使方法命名空间非常混乱——并且与您想要的自然名称冲突)。

于 2009-05-12T14:57:07.183 回答
1

如果您使用的是 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

您可以在此处阅读有关细化的更多信息。

于 2014-05-19T13:11:44.727 回答
0

制作一个模型,TimeAgo 或类似的东西。在此处实现以下想法: “文字化”数字的代码片段

然后,在您的控制器中,使用此类创建实例变量。然后,在您看来,请致电@from_time.in_words

于 2009-05-12T02:56:52.723 回答