Rails 3引擎 - 为用户提供配置

时间:2010-10-31 23:19:31

标签: ruby-on-rails-3 configuration rails-engines

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

是否有人有正确或可接受的方式链接?

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

# 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 个答案:

答案 0 :(得分:6)

简短回答:

创建一个名为your_engine_class.rb的文件,并输入托管应用的配置/初始化程序。以下是此文件的示例。

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

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

config.param_name

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

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

答案 1 :(得分: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

在父应用程序

中的初始化程序中调用class方法
YourEngine.setup do |config|
  config.your_config_var = "nyan cat"
end

现在您可以在引擎的初始化过程中自由访问your_config_var。您可以在引擎的config/initializers目录中创建文件,也可以使用Rails Initializer挂钩。

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

答案 2 :(得分: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