在rails中,放置需要在任何地方可用的方法的正确位置

jpw*_*ynn 3 ruby-on-rails helper

我有很多实用工具方法(例如用于重新格式化或解析诸如字符串之类的简单对象)的方法,我一直将它们放在ApplicationHelper中。

但是,显然模型中的类方法无法访问ApplicationHelper方法。

有一个解决方法,可以在我的整个项目中使用:

include ApplicationHelper # needed to use apphelper method in instance method
extend ApplicationHelper # needed to use apphelper method in class method
Run Code Online (Sandbox Code Playgroud)

而且似乎可行。但这似乎是一种矛盾。

有没有更好的放置实用程序方法的地方,以便可以从项目的任何位置访问它们-视图,控制器方法,模型实例方法,模型类方法?

dee*_*our 5

lib/是为了什么。我有一个文件在lib/deefour.rb

require "deefour/core_ext"

module Deefour; end
Run Code Online (Sandbox Code Playgroud)

我把自定义方法 lib/deefour/helpers.rb

module Deefour
  module Helpers
    extend self

    def some_method
      # ...
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

和核心猴子补丁 lib/deefour/core_ext.rb

class String
  def my_custom_string_method(str)
    # ...
  end
end
Run Code Online (Sandbox Code Playgroud)

config/initializers/deefour.rb我把

require "deefour"
Run Code Online (Sandbox Code Playgroud)

在你config/application.rb确保你有

config.autoload_paths += Dir["#{config.root}/lib"]
Run Code Online (Sandbox Code Playgroud)

最后,在ApplicationController (对于控制器)ApplicationHelper (对于视图)以及我需要的其他地方(即,这里和那里的特定模型)中,我只需

include ::Deefour::Helpers
Run Code Online (Sandbox Code Playgroud)