如何在Rails4引擎中添加autoload_path?

Ben*_*t B 5 ruby-on-rails

通常我在config/application.rb中添加以下内容来添加autload_paths:

config.autoload_paths += Dir[Rails.root.join('app', 'poros', '{**}')]
Run Code Online (Sandbox Code Playgroud)

如何在引擎中实现相同的目标?它似乎在我在主机应用程序中的application.rb中使用相同的代码时工作,但是我认为代码不在引擎中并且需要添加到主机应用程序以使事情有效是很难看的.

我发现通过引擎添加加载路径的唯一解决方案是将其添加到lib/engine/engine.rb:

config.to_prepare do
  Dir.glob(Rails.root + "../../app/poros/**/*.rb").each do |c|
    require_dependency(c)
  end
end
Run Code Online (Sandbox Code Playgroud)

然而,这似乎有一些根本性的错误,因为这会在我进行控制台重新加载时导致问题(例如,它告诉我已经定义了常量或者关注点无法执行包含块两次)

在引擎本身中执行此操作的正确方法是什么?(不敢相信这是如此艰难/不常见,我真的google了很多,但我找不到解决方案)

jan*_*oeh 8

根据Rails :: Engine文档,您可以在Railtie中添加自动加载路径,如下所示:

class MyEngine < Rails::Engine
  # Add a load path for this specific Engine
  config.autoload_paths << File.expand_path("../lib/some/path", __FILE__)

  initializer "my_engine.add_middleware" do |app|
    app.middleware.use MyEngine::Middleware
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 当直接在lib/test_engine/engine.rb中调用时,Rails.root会产生nil.当我将它包装在config.to_prepare块中时,Rails.root.join正在工作,它是主机应用程序引擎的根目录.我尝试了config.autoload_paths + =%W(#{config.root}/app/poros)并且我在加载控制台时遇到NameError:uninitialized constant TestClass (2认同)