【问题标题】:rails: autoload files inside engine's lib directoryrails:在引擎的 lib 目录中自动加载文件
【发布时间】:2016-09-19 04:43:46
【问题描述】:

我正在使用一个引擎开发这个 Rails 应用程序,该引擎是一种子应用程序,为我现有的应用程序添加了更多路由。

多亏了 Rails,这个概念非常强大。

但我面临着在开发模式下在我的引擎 lib 目录中自动加载文件更改的奇怪挑战。每次我在引擎的 app 目录中进行更改时,无论是 model 还是 controller,它都可以完美运行,但不会对 lib 目录下的任何文件进行任何更改。有没有办法我可以做到这一点?谢谢你的帮助。

【问题讨论】:

    标签: ruby-on-rails autoload rails-engines


    【解决方案1】:

    根据Rails::Engine docs,您可以自动加载路径,例如-

    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
    

    如果你不想自动加载,你可以直接在你的类中用require语句来require文件-

    require 'my_engine/my_object'
    class MyModel < AR::Base
      ...
    end
    

    这将起作用,因为您的引擎已加载到您的应用中,因此您可以访问其中的库。

    【讨论】:

    • 建议的 File.expand_path("../lib/some/path", FILE) 产量
    • 据我所知,关于中间件的 3 行代码不适用于 OP 的问题(它们只是文档中关于配置的更大讨论的一部分)。我所需要的(Rails 5)就是调整 autoload_paths。另外值得注意的是,由于我的 lib 文件与 engine.rb 位于同一文件夹中,因此我的路径只是 . for ../lib/some/path
    【解决方案2】:

    将以下代码放入您的config/application.rb

    config.eager_load_paths += ["#{Rails.root}/lib"]
    

    如果您只想在开发模式下使用此功能,请使用以下

    config.eager_load_paths += ["#{Rails.root}/lib"] if Rails.env.development?
    

    【讨论】:

    • 问题是关于rails engine 而不是完整的rails app
    猜你喜欢
    • 2012-07-29
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 2015-03-08
    相关资源
    最近更新 更多