如何在Rails4引擎中添加autoload_path?

时间:2015-02-13 12:45:23

标签: ruby-on-rails

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

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

如何在引擎中实现相同的目标? 当我在主机应用程序中的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

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

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

2 个答案:

答案 0 :(得分:8)

根据Rails::Engine documentation,您可以在您的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

答案 1 :(得分:2)

如果poros是应用的子目录,则无需再次添加。

  

应用程序和引擎中应用程序的所有子目录都在启动时出现。例如,app / controllers。它们不需要是默认目录,任何自定义目录(如app / workers)都会自动归属于autoload_paths。