我有一个 gem,它基于
RailsWarden::Manager
文件中的标志有条件地加载 config/initializers/mygem.rb
:
module Mygem
class Railtie < Rails::Railtie
initializer "mygem_engine.initialize_warden" do |app|
if Mygem.use_warden_middleware?
app.config.middleware.use RailsWarden::Manager do |manager|
# Config for RailsWarden::Manager
end
end
end
end
end
这在某些消费者中效果很好,但在其他消费者中,在加载
use_warden_middleware?
中的相应行之前调用 config/initializers/mygem.rb
,以将值设置为 false(默认为 true)。
此 Railtie 已加载到主机应用程序
config/application.rb
中,并在 require "mygem/railtie"
行之后添加 Bundler.require(*Rails.groups)
行。
我找到的唯一解决方案是在其之前添加一行以需要初始化程序,以便它首先加载:
require_relative "initializers/mygem"
require "mygem/railtie"
但是,我不想让宝石的消费者必须包括这两条线。有什么办法,在我的 gem 中说“等到
mygem_engine.initialize_warden
运行之前加载配置”?
我尝试在 Railtie 中添加一个
config.after_initialize
块,但似乎运行得太晚,无法正确添加中间件。
after_initialize
块:
initializer "mygem_engine.initialize_warden" do
config.after_initialize do |app|
# TODO: code here
end
end
https://guides.rubyonrails.org/engines.html#available-configuration-hooks