6

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

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

我尝试使用 environment.rb 并放置类似的东西

USE_USER_APP = true

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

那么,有人吗?

4

6 回答 6

11

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

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

于 2008-09-21T02:57:47.640 回答
4

最基本的事情是从你的 environment.rb 中设置一个类变量。我为谷歌分析做了这个。本质上,我想要一个不同的密钥,具体取决于我所处的环境,因此开发或登台不会扭曲指标。

我就是这样做的。

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 Analytics JavaScript 的默认布局,您只需调用Analytics::GoogleAnalytics.account_id.

于 2008-09-21T05:20:24.817 回答
4

我昨天正在帮助一位朋友设置里卡多提到的解决方案。我们通过加载类似于此的 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
于 2008-09-21T11:52:27.543 回答
0

我在这里找到了一个好方法

于 2008-09-21T02:56:39.763 回答
0

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

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

于 2011-07-19T20:46:12.840 回答
0

我使用了Rails Settings Cached

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

于 2012-10-22T22:36:25.037 回答