在Ruby on Rails中,要扩展String类,应将代码放在哪里?


78

如果在Ruby on Rails上,我需要添加一个名为

class String
  def capitalize_first
    # ...
  end
end

想知道文件应该去哪里?(哪个目录和文件名,是否需要任何初始化代码?)这用于Rails 3.0.6项目。

Answers:


139

我总是在core_ext目录中添加lib目录。

创建一个用于加载自定义扩展名的初始化程序(例如:)config/initializers/core_exts.rb。并在其中添加以下行:

Dir[File.join(Rails.root, "lib", "core_ext", "*.rb")].each {|l| require l }

并使用以下扩展名:

lib/core_ext/string.rb

class String
  def capitalize_first
    # ...
  end
end

我想知道...我们应该扩展String类还是仅在视图中使用辅助方法?但是,然后,如果它是一个帮助者,那么使其在控制器(或模型)中工作也很麻烦,并且无法像s.capitalize_first.truncate(30)
nonopolarity

14
原谅我的无知,但您能举一个“初始化程序配置”的例子吗?谢谢
Brian

15
我将其放在config / application.rb中: class Application < Rails::Application ... config.autoload_paths += Dir[File.join(Rails.root, "lib", "core_ext", "*.rb")].each {|l| require l } ...
d3vkit 2012年

5
如果您将扩展名放在内lib/core_ext/string.rb,请不要忘记require 'core_ext/string'在文件顶部包含使用扩展名的位置。
RokStrniša16年

1
@moondaisy你错了。lib目录不应位于app目录内。
Fabrizio Bertoglio

65

您可以在config / initializers / string.rb中执行此操作

class String
  def capitalize_first
    # ...
  end
end

应该是您所需要的(除了重新启动应用程序)。


1
我很好奇您会在哪里为该扩展名添加测试文件?
konyak

3
是最简单的方法。但是,当您在开发中进行更改时,您会失去对重新加载此类的支持。
乔什(Josh)

5

Rails 3.1中的准则是解决方法:

http://guides.rubyonrails.org/plugins.html#extending-core-classes

如果遵循默认约定,则无需弄乱初始化程序配置。


16
...用于插件
brittohalloran 2012年

1
此方法不急于加载扩展。在调用模块/类名后,它会加载它(从这个rails指南中是Yaffle)。这意味着您将无法调用扩展方法,除非首先调用模块名称(Yaffle),并且无法在初始化程序中定义此模块名称。我已经在控制台中对其进行了测试,这就是autoload_paths的工作方式。最好在config / initializers /或config / application.rb中使用扩展文件。
konyak
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.