Rails 5 Требуется зависимый драгоценный камень и его инициализаторы условно в драгоценном камне. - PullRequest
0 голосов
/ 16 октября 2018

Мы пишем драгоценный камень, который включает в себя несколько общих драгоценных камней для пары наших общих приложений.Мы хотим иметь возможность иметь конфигурацию в application.rb или enviroment.rb/*rb что-то вроде config.fruit_chain.enable_transport = true из приложения-потребителя, чтобы условно требовать гем и его динамический инициализатор.Но инициализатор из общего драгоценного камня не запускается после require в railtie.Я задавался вопросом, есть ли лучший способ сделать это

fruit_store / config / application.rb.(приложение потребления)

module FruitStore
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 5.2

    config.fruit_chain.enable_transport = true
  end
end

fruit_chain / lib / fruit_chain.rb (Наша жемчужина)

require analytic 
- require transport      <----- removed this so it dose not autoload
require marketing
...

module FruitChain
end

fruit_chain / lib / fruit_chain / rails / railtie.rb

module FruitChain
  module Rails
    class Railtie < ::Rails::Railtie
      config.fruit_chain = ActiveSupport::OrderedOptions.new
      config.fruit_chain.enable_transport = false

      config.before_initialize do |app|
        if app.config.fruit_chain.enable_transport
          Kernel.require 'transport'             <--- this require the gem correct and load it up         

          app.initializers.find{ 
            |a| a.name === 'transport.configure'
          }.run <--- transport.configure initializer doesn't kick off
        end        
      end
    end
  end
end

transport / lib / transport.rb.(Зависимый общий камень)

require transport/rails/railtie 
...

module Transport
end

transport / lib / transport / rails / railtie.rb

module Transport
  module Rails
    class Railtie < ::Rails::Railtie
      initializer 'transport.configure' do |app|
      ...
      end
    end
  end
end
...