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

nop*_*ole 74 ruby ruby-on-rails ruby-on-rails-3

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

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

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

Mik*_*wis 131

我总是core_ext在我的目录中添加一个目录lib.

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

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

你的扩展名如下:

lib/core_ext/string.rb

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

  • 原谅我的无知,但你能举一个"初始化配置"的例子谢谢 (14认同)
  • 我将它放在config/application.rb中:`class Application <Rails :: Application ... config.autoload_paths + = Dir [File.join(Rails.root,"lib","core_ext","*.rb") ] .each {| l | 要求l} ...` (14认同)
  • 如果将扩展名放在`lib/core_ext/string.rb`中,请不要忘记在您使用它的文件的顶部包含`require'core_ext/string'. (4认同)

njo*_*den 64

你可以在config/initializers/string.rb中完成

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

应该是你所需要的(除了app重启).

  • 这是最简单的方法.谢谢@njorden (5认同)
  • 最简单的方法,是的.但是,当您在开发中进行更改时,您将失去对重新加载此类的支持. (3认同)

Hop*_*eam 5

Rails 3.1中的指南是要走的路:

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

如果您遵循默认约定,则无需使用初始化程序配置.

  • ...对于**插件** (15认同)
  • 此方法不会立即加载扩展。它会在您调用模块/类名称(在本 Rails 指南中,它是 Yaffle)后加载它。这意味着在首先调用模块名称 (Yaffle) 之前您将无法调用扩展方法,并且您无法在初始值设定项中定义此模块名称。我已经在控制台中对其进行了测试,这就是 autoload_paths 的工作原理。需要 config/initializers/ 或 config/application.rb 中的扩展文件是最好的选择。 (2认同)