Domanda

Non riesco a trovare alcuna documentazione su come effettuare le seguenti operazioni:. Ho bisogno di fornire una variabile di configurazione per tutte le applicazioni che utilizzano il mio motore in modo che possano passare facilmente le impostazioni per il mio motore

Qualcuno ha qualche link ad un modo corretto o accettato di fare questo?

Modifica come aggiornamento, ho trovato un modo decente per fare questo. Codice è al di sotto.

# file: lib/my_engine.rb
module MyEngine

  class Engine < Rails::Engine

    initializer "my_engine.configure_rails_initialization" do |app|
      # Engine configures Rails app here, this is not what my question was about
    end

  end

  # This is what I was trying to figure out
  def self.config(&block)
    @@config ||= MyEngine::Configuration.new

    yield @@config if block

    return @@config
  end

end

Questo consente a qualsiasi applicazione che utilizza il mio motore per configurarlo come qui di seguito in uno qualsiasi dei loro inizializzatori o il loro file di environment.rb, chiamando tutti i metodi definiti nella classe MyEngine::Configuration:

MyEngine.config do |config|
  config.some_configuration_option = "Whatever"
end
È stato utile?

Soluzione

Breve risposta:

Creare un file chiamato your_engine_class.rb e messo in config / inizializzatori della vostra applicazione di hosting. Ecco un esempio di questo file.

module YourEngineClass
  class Engine < Rails::Engine
    config.param_name = 'value'    
  end
end

Poi all'interno del vostro engine.rb principale è possibile accedere a:

config.param_name

Più rispondere: ho creato un motore di stub che include questo e un sacco di altra configurazione standard è necessario, è possibile utilizzarlo come punto di partenza:

http://keithschacht.com/creating-a-rails-3-engine- plugin-gioiello /

Altri suggerimenti

Personalmente, come il modello Devise usi, che definisce un metodo di classe nel modulo del vostro motore e poi un inizializzatore nell'applicazione genitore .

Creare un metodo di classe per chiamare dall'applicazione principale

module YourEngine
  class << self
    attr_accessor :your_config_var
  end

  def self.setup(&block)
    # You can yield your own object encapsulating your configuration logic/state
    yield self
  end
end

Chiamare il metodo di classe in un inizializzatore nell'applicazione padre

YourEngine.setup do |config|
  config.your_config_var = "nyan cat"
end

Ora siete liberi di your_config_var l'accesso nel processo di inizializzazione del motore. È possibile creare un file nella directory config/initializers del motore o utilizzare il Rails Initializer ganci.

Mi piace questo approccio, poiché si ha più il controllo su ciò che oggetto di configurazione si espongono ai clienti e non abbiano la prevalenza metodo config del motore.

sembra migliore per me come segue:

#lib/my_engine.rb
require 'rails'

module MyEngine
  class Engine < Rails::Engine

  end

  def self.config(&block)
    yield Engine.config if block
    Engine.config
  end
end
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top