在Rails中,如何向String类添加新方法?

ale*_*lex 48 ruby monkeypatching ruby-on-rails-3

我想在我的Rails项目中为不同的对象构建一个索引,并希望添加一个'count_occurences'方法,我可以在String对象上调用它.

我看到我可以做类似的事情

class String
  def self.count_occurences
    do_something_here
  end
end
Run Code Online (Sandbox Code Playgroud)

定义此方法的确切方法是什么,以及将代码放在我的Rails项目中的位置?

谢谢

Rya*_*igg 93

您可以在应用程序中定义一个新类,lib/ext/string.rb并将其放入其中:

class String
  def to_magic
    "magic"
  end
end
Run Code Online (Sandbox Code Playgroud)

要加载此类,您需要在config/application.rb文件或初始化程序中要求它.如果你有很多这些扩展,初始化器更好!加载它的方法很简单:

require 'ext/string'
Run Code Online (Sandbox Code Playgroud)

to_magic然后,该方法将在应用程序/控制台内的类的实例上可用String,即:

>> "not magic".to_magic
=> "magic"
Run Code Online (Sandbox Code Playgroud)

无需插件.

  • @RyanBigg:不确定为什么你的指示不适合我.可能是一些设置问题.我正在使用Rails 3.0.7.这是我做的工作:1.将config.autoload_paths + = Dir ["#{Rails.root}/lib/ext"]添加到config/application.rb 2.添加require'xt/string.rb'到需要这种自定义String方法的实际rails文件.但感谢您的有用帖子.我得到了它的工作! (4认同)
  • @alex:可能会,但您需要重新启动服务器或控制台,具体取决于您使用它来访问它.`autoload_paths`选项配置包含将自动加载的文件的目录,因此如果它没有被加载,我怀疑你没有完成我刚才说的那两件事. (2认同)
  • @RyanBigg感谢初始化器的提示.我将它放入`config/initializers/load_class_extensions.rb`并从那里开始需要它. (2认同)
  • 对我不起作用,它在rails 5中有所不同吗? (2认同)
  • @Daniel如果将上面的代码放在`config/initializers/string.rb`中,你甚至不需要明确地"要求"它.请参见http://stackoverflow.com/a/5654574/3159183 (2认同)

Chr*_*ies 12

我知道这是一个旧线程,但似乎并不像Rails 4+中所接受的解决方案(至少不适合我).将扩展名rb文件放入config/initializers中.

或者,您可以将/ lib添加到Rails自动加载器(在config/application.rb中,在Application类中:

config.autoload_paths += %W(#{config.root}/lib)

require 'ext/string'
Run Code Online (Sandbox Code Playgroud)

见:http: //brettu.com/rails-ruby-tips-203-load-lib-files-in-rails-4/


Ire*_*bis 5

当你想扩展一些核心类时,你通常想要创建一个插件(当在另一个应用程序中需要这段代码时它很方便)。在这里您可以找到如何创建插件的指南http://guides.rubyonrails.org/plugins.html和第 3 点向您展示如何扩展 String 类:http : //guides.rubyonrails.org/plugins.html#扩展核心类