Rails 3自动加载

dan*_*iel 15 ruby-on-rails ruby-on-rails-3

我有一个类ConstData:

class ConstData

  US_CITIES = ['miami', 'new york']

  EUROPERN_CITIES = ['madrid', 'london']

end
Run Code Online (Sandbox Code Playgroud)

它存储在/lib/const_data.rb下

我的想法是在模型,控制器或视图中我可以做到:

ConstData::US_CITIES 获得US_CITIES等

Rails应该自动加载这个类,我从以下网址获取:http: //groups.google.com/group/rubyonrails-talk/browse_thread/thread/662abfd1df9b2612?hl = en

但这不起作用.任何人都可以解释我如何做到这一点?

Dam*_*IEU 48

@daniel的帖子是从2008年开始的.自那时起,Rails发生了变化.
事实上,最近.Rails3不会自动加载lib /目录.

你可以很容易地重新激活它.打开config/application.rb并在配置(在Application类中)添加以下内容:

config.autoload_paths += %W(#{config.root}/lib)
Run Code Online (Sandbox Code Playgroud)

然后你的lib/dir将被自动加载.

  • 警告!您在/ lib中可能拥有的许多模块都具有在初始化程序中设置的配置信息,并且在重新加载模块时将丢弃配置信息,从而导致在测试和生产中正常工作的开发中出现无法解释的失败.解决方案是将/ lib路径添加到config.autoload_once_paths而不是config.autoload_paths. (6认同)
  • 另外值得注意的是文件名很重要.它不适用于这个确切的例子,但它是相关的,我花了很长时间才意识到我的错误.请参阅:http://stackoverflow.com/questions/4074830/adding-lib-to-config-autoload-paths-in-rails-3-does-not-autoload-my-module (4认同)
  • << YourApplication >> :: Application.config.autoload_paths (2认同)

小智 13

autoload_paths不能为你工作的原因你被迫做了:

Dir["lib/**/*.rb"].each do |path|
  require_dependency path
end
Run Code Online (Sandbox Code Playgroud)

是因为你忘了命名你的课程.

lib/awesome/stuffs.rb应该包含这样的类/模块:

class/module Awesome::Stuffs
....
Run Code Online (Sandbox Code Playgroud)

但你有:

class/module Stuffs
....
Run Code Online (Sandbox Code Playgroud)

Rails只能自动加载其名称与其文件路径和文件名匹配的类和模块.

:)