在rails中存储应用程序特定配置的最佳方法是什么?

时间:2008-09-21 02:43:01

标签: ruby-on-rails configuration

我需要在rails中存储应用特定的配置。但必须是:

  • 可在任何文件(模型,视图,助手和控制器)中访问
  • 指定(或不指定)环境,这意味着每个环境都可以覆盖environment.rb中指定的配置。

我尝试过使用environment.rb并添加类似

的内容
USE_USER_APP = true

对我有用,但是当尝试在特定环境中覆盖它时它不会工作,因为例如,production.rb似乎在Rails:Initializer.run块中。

那么,有人吗?

6 个答案:

答案 0 :(得分:11)

看看Configatron:http://github.com/markbates/configatron/tree/master

我还没有使用它,但他现在正在积极开发它,看起来很不错。

答案 1 :(得分:4)

最基本的事情是从environment.rb设置一个类变量。我已经为Google Analytics做了这个。基本上我需要一个不同的密钥,具体取决于我所处的环境,因此开发或暂存不会偏离指标。

这就是我做到的。

lib/analytics/google_analytics.rb

module Analytics
  class GoogleAnalytics
    @@account_id = nil

    cattr_accessor :account_id
  end
end

然后在environment.rbenvironments/production.rb或任何其他环境文件中:

Analytics::GoogleAnalytics.account_id = "xxxxxxxxx"

然后,您需要引用的任何地方,比如使用Google AnalyticsJavaScript的默认布局,只需拨打Analytics::GoogleAnalytics.account_id即可。

答案 2 :(得分:4)

我昨天帮助一位朋友设立了the solution mentioned by Ricardo。我们通过加载类似于此的YAML文件(从内存开始)来对它进行了一些攻击:

require 'ostruct'
require 'yaml'
require 'erb'
#config = OpenStruct.new(YAML.load_file("#{RAILS_ROOT}/config/config.yml"))
config = OpenStruct.new(YAML.load(ERB.new(File.read("#{RAILS_ROOT}/config/config.yml")).result))
env_config = config.send(RAILS_ENV)
config.common.update(env_config) unless env_config.nil?
::AppConfig = OpenStruct.new(config.common)

这允许他在配置中嵌入Ruby代码,就像在Rhtml中一样:

development:
  path_to_something: <%= RAILS_ROOT %>/config/something.yml

答案 3 :(得分:0)

我找到了一个好方法here

答案 4 :(得分:0)

使用环境变量。 Heroku使用它。请记住,如果您在代码库中保留配置,任何有权访问代码的人都可以访问任何秘密配置(aws api密钥,网关API密钥等)。

daemontool的envdir是一个设置配置的好工具,我很确定Heroku使用它来为应用程序提供环境变量。

答案 5 :(得分:0)

我使用过Rails Settings Cached

使用起来非常简单,可以缓存配置值并允许您动态更改它们。