我想,所有的助手,在我的整个Rails应用程序,替换语法如下:

time_ago_in_words(@from_time)

与此:

@from_time.time_ago_in_words

在理想情况下这种变化也会使我的应用程序(以同样的方式,比方说,5.times是)。

随时随地可用的帮工

有谁知道,这是否一个插件?难道是很难推出自己的?

有帮助吗?

解决方案

如果您创建一个新的模型,你可以把它从现有的类继承的方法。

实施例(应用/模型/ 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类用自己的方法,而不是使用函数/帮手。

<强>主要修改

基于这个答案和他自己的答案对上述问题的伊恩评论

,我发挥各地在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一个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实例::基地。或者,如果你不想去这样重量级的,你可以创建自己的类只包括你想要的帮手(你不想直接包括佣工每个时间,日期,字符串等,一流,虽然,因为这将扰乱方法命名空间相当激烈 - 和冲突与你想要的自然名称)

如果您在使用Ruby 2.1,你可以使用改进。它们是猴子修补Ruby的类的替代品。借用 @贾罗德的猴的贴剂示例:

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或类似的东西。在这里实现以下这样的想法: 一个代码段 “wordifying” 号码

然后,在控制器中,创建使用这个类的实例变量。然后,在您的视图,呼叫@from_time.in_words

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top