渴望加载rails lib

时间:2012-11-04 15:55:33

标签: ruby-on-rails ruby

看起来这个问题将在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

3 个答案:

答案 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::Reloaderto_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挂钩中,并在此处手动要求依赖项。