7

我似乎找不到任何有关如何执行以下操作的文档:我需要为使用我的引擎的任何应用程序提供一个配置变量,以便它们可以轻松地将设置传递给我的引擎。

有没有人有任何链接到正确或可接受的方式来做到这一点?

编辑:作为更新,我想出了一个不错的方法来做到这一点。代码如下。

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

3 回答 3

6

简短的回答:

创建一个名为 your_engine_class.rb 的文件并将其放入托管应用程序的 config/initializers 中。这是此文件的示例。

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

然后在您的 main engine.rb 中,您可以访问:

config.param_name

更长的答案:我创建了一个存根引擎,其中包括此引擎以及您需要的许多其他标准配置,您可以将其用作起点:

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

于 2010-11-02T01:26:32.553 回答
5

我个人喜欢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挂钩。

我喜欢这种方法,因为您可以更好地控制向客户端公开的配置对象,并且不会覆盖引擎的config方法。

于 2013-12-01T19:18:21.343 回答
4

对我来说似乎更好如下:

#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
于 2013-03-01T15:43:55.530 回答