从Gem向Rails添加autoload_path



我想编写一个gem,将app/services目录添加到Rails应用程序中。

由于我想从宝石中添加它,我想出了这个解决方案:

class Railtie < ::Rails::Railtie
  config.after_initialize do |app|
    ::Rails.logger.info "adding #{ActiveService::Configuration.path} to autoload_path"
    app.config.autoload_paths = [ActiveService::Configuration.path] + app.config.autoload_paths
  end
end

问题是config.autoload_path是一个冻结的数组,因此修改它似乎不是一个好主意。

关于如何以更好的方式实现这一目标,有什么建议吗?

config.autoload_paths被冻结在:set_autload_paths初始值设定项中。Array被传递给ActiveSupport::Dependencies.autoload_paths,因此修改原始Array没有多大意义。因此它被冻结了。

您应该能够挂接到:before => :set_autoload_paths并在config.autoload_paths被传递和冻结之前扩展它:

class Railtie < ::Rails::Railtie
  initializer 'activeservice.autoload', :before => :set_autoload_paths do |app|
    app.config.autoload_paths << ActiveService::Configuration.path
  end
end

有关初始化器挂钩的文档可以在guides.rubyonrails.org/initialization.html

上找到

首先,自Rails 3.0以来,app/*下的所有目录都已在加载路径中。无论如何,如果你想这样做,你应该使用路径api。Rails源代码示例:

https://github.com/rails/rails/blob/master/railties/lib/rails/engine/configuration.rb#L42

相关内容

  • 没有找到相关文章

最新更新