Rails 3 Engine - предоставляет конфигурацию для пользователей - PullRequest
7 голосов
/ 01 ноября 2010

Кажется, я не могу найти никакой документации о том, как сделать следующее: мне нужно предоставить переменную конфигурации для любых приложений, использующих мой движок, чтобы они могли легко передавать настройки моему движку.

Есть ли у кого-нибудь ссылки на правильный или принятый способ сделать это?

РЕДАКТИРОВАТЬ: В качестве обновления я нашел достойный способ сделать это. Код ниже.

# 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

Это позволяет любому приложению, использующему мой движок, настраивать его, как показано ниже, в любом из своих инициализаторов или в файле environment.rb, вызывая любые методы, определенные в классе MyEngine::Configuration:

MyEngine.config do |config|
  config.some_configuration_option = "Whatever"
end

Ответы [ 3 ]

6 голосов
/ 02 ноября 2010

Краткий ответ:

Создайте файл your_engine_class.rb и поместите в config / initializer вашего хостинг-приложения.Пример файладругой стандартной конфигурации, которая вам понадобится, вы можете использовать ее в качестве отправной точки:

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

5 голосов
/ 01 декабря 2013

Мне лично нравится шаблон Devise , который определяет метод класса в модуле вашего движка, а затем инициализатор в родительском приложении.

Создать метод класса для вызова из родительского приложения

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

вызов метода класса в инициализаторе в родительском приложении

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

Теперь вы можете свободно обращаться к your_config_var в процессе инициализации вашего движка. Вы можете создать файл в каталоге config/initializers вашего движка или использовать Rails Initializer hooks.

Мне нравится этот подход, так как вы имеете больший контроль над тем, какой объект конфигурации вы предоставляете клиентам, и не переопределяете метод config движка.

4 голосов
/ 01 марта 2013

Мне кажется, что лучше:

#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
...