在 Rails 中,如何向 String 类添加新方法?
Posted
技术标签:
【中文标题】在 Rails 中,如何向 String 类添加新方法?【英文标题】:In Rails, how to add a new method to String class? 【发布时间】:2011-11-21 09:14:36 【问题描述】:我想为我的 Rails 项目中的不同对象建立一个索引,并想添加一个可以在 String 对象上调用的“count_occurences”方法。
我发现我可以做类似的事情
class String
def self.count_occurences
do_something_here
end
end
定义此方法的确切方法是什么,以及将代码放在我的 Rails 项目中的什么位置?
谢谢
【问题讨论】:
这很难看。如果另一个库也添加了一个不完全相同的count_occurences
方法怎么办?
大概是别的东西没有那个方法或者他早就在用了
如果您不熟悉monkeypatching,您可能想浏览标记为ruby 和monkeypatching 的其他Stack Overflow 问题。
根据***.com/a/5654574/3159183,您实际上可以将代码放入config/initializers/string.rb
并完成(重启服务器后)
【参考方案1】:
当你想扩展一些核心类时,你通常想创建一个插件(在另一个应用程序中需要这个代码时很方便)。在这里您可以找到如何创建插件http://guides.rubyonrails.org/plugins.html 的指南,第 3 点向您展示如何扩展 String 类:http://guides.rubyonrails.org/plugins.html#extending-core-classes
【讨论】:
有没有一种方法可以让我完成同样的事情,而无需创建一个完整的插件(这对于我想要完成的事情来说似乎需要做很多工作......)? 我知道 Ryan 发布的另一个解决方案,它也是正确的。毫无疑问。但我推荐你使用插件,因为这是我们公司所做的。当您创建一个插件时,您可以将它放在 github 上,每个人都可以将它安装到他/她的应用程序中。我知道这是更多的工作,但通常是值得的。而且我真的不觉得我应该在这里被扣分......【参考方案2】:您可以在lib/ext/string.rb
的应用程序中定义一个新类并将此内容放入其中:
class String
def to_magic
"magic"
end
end
要加载这个类,你需要在你的config/application.rb
文件或初始化器中使用它。如果您有许多这些扩展,那么初始化器会更好!加载方式很简单:
require 'ext/string'
to_magic
方法随后将在您的应用程序/控制台内的String
类的实例上可用,即:
>> "not magic".to_magic
=> "magic"
不需要插件。
【讨论】:
@alex:会的,但您需要重新启动服务器或控制台,具体取决于您使用什么来访问它。autoload_paths
选项配置包含将自动加载的文件的目录,因此如果它没有被加载,我怀疑你还没有完成我刚才说的这两件事。
@RyanBigg:不知道为什么你的指令对我不起作用。可能是一些设置问题。我正在使用 Rails 3.0.7。这是我为使其工作所做的: 1. 添加 config.autoload_paths += Dir["#Rails.root/lib/ext"] 到 config/application.rb 2. 添加 require 'ext/string.rb'到需要这种自定义 String 方法的实际 rails 文件。但感谢您的有用帖子。我让它工作了!
@RyanBigg 感谢初始化程序的提示。我把它放到config/initializers/load_class_extensions.rb
并从那里现在需要它。
对我不起作用,它在 Rails 5 中有所不同?
@Daniel 如果你把上面的代码放在config/initializers/string.rb
,你甚至不需要明确地require
。见***.com/a/5654574/3159183【参考方案3】:
我知道这是一个旧线程,但似乎接受的解决方案似乎不适用于 Rails 4+(至少不适合我)。将扩展 rb 文件放入 config/initializers 工作。
或者,您可以将 /lib 添加到 Rails 自动加载器(在 config/application.rb 中,在 Application 类中:
config.autoload_paths += %W(#config.root/lib)
require 'ext/string'
看到这个: http://brettu.com/rails-ruby-tips-203-load-lib-files-in-rails-4/
【讨论】:
以上是关于在 Rails 中,如何向 String 类添加新方法?的主要内容,如果未能解决你的问题,请参考以下文章