9

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

因为我想从 Gem 中添加它,所以我想出了这个解决方案:

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是一个冻结的数组,因此修改它似乎不是一个好主意。

关于如何以更好的方式实现这一目标的任何建议?

4

2 回答 2

12

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找到

于 2011-06-18T08:56:29.453 回答
4

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

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

于 2011-06-20T22:16:38.550 回答