在 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 类添加新方法?的主要内容,如果未能解决你的问题,请参考以下文章

Rails/PostgreSQL:向文本添加字符限制

向 rails 命令添加额外属性

向 Rails 4 添加自定义字体的官方方式?

Rails - 如何向用 javascript 创建的表单添加 CSRF 保护?

向架构添加新字段后如何更新旧文档?

如何向 Rails 4 中的所有 ActiveRecord 模型添加 `audited` 方法调用?