我想编写一个将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
是一个冻结的数组,因此修改它似乎不是一个好主意。
有关如何以更好的方式实现这一目标的任何建议吗?
答案 0 :(得分:11)
config.autoload_paths
冻结在:set_autload_paths
initializer内。数组传递给ActiveSupport::Dependencies.autoload_paths
,因此修改原始数组没有多大意义。因此它被冻结了。
你应该能够在传递和冻结之前挂钩: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
找到答案 1 :(得分:4)
首先,app / *下的所有目录都已经在Rails 3.0之后的加载路径中。无论如何,如果你想这样做,你应该使用路径api。 Rails源代码示例:
https://github.com/rails/rails/blob/master/railties/lib/rails/engine/configuration.rb#L42