如何仅在加载所有配置/初始化程序后才加载 gem 的 Railites?

问题描述 投票:0回答:1

我有一个 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
块,但似乎运行得太晚,无法正确添加中间件。

ruby-on-rails rack rails-engines
1个回答
0
投票

您可以使用

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

© www.soinside.com 2019 - 2024. All rights reserved.