看起来这个问题将在Rails 4中解决:
http://blog.plataformatec.com.br/2012/08/eager-loading-for-greater-good/
但在那之前,我想知道如何在我的/lib
中加载模块/类。
在IRB中,我第一次尝试访问时似乎是按需加载:
Foo::Bar.constants
=> []
Foo::Bar::Service
=> Foo::Bar::Service
Foo::Bar.constants
=> [:ServiceBase, :Service]
我在该模块中有其他几个类,我的代码依赖于能够在运行时使用Foo::Bar.const_defined?
查找它们 - 如何确保所有Foo::Bar
的类在启动时加载?
我已在config.autoload_paths += %W(#{config.root}/lib)
中使用application.rb
。
答案 0 :(得分:8)
将其放入root/config/initializers/eager.rb
应该加载该文件夹中的所有.rb文件:
Dir["#{Rails.root}/lib/*.rb"].each {|file| load file}
答案 1 :(得分:5)
我把它放在application.rb解决了问题
config.eager_load_paths += Dir["#{config.root}/lib/**/"]
答案 2 :(得分:1)
在eager_load_paths
中结合使用ActiveSupport::Reloader
和to_prepare
的{{1}}钩子:
development.rb
将路径添加到config.eager_load_paths += Dir["app/models/stimodel/**/*.rb"]
ActiveSupport::Reloader.to_prepare do
Dir["app/models/stimodel/**/*.rb"].each { |f| require_dependency("#{Dir.pwd}/#{f}") }
end
时,请确保Rails在启动时加载它们。为了确保在进行任何更改或添加新文件时,Rails重新加载我们的模型,我们还需要挂钩到Reloader的eager_load_paths
挂钩中,并在此处手动要求依赖项。