在rails中存储应用程序特定配置的最佳方法是什么?
我需要在rails中存储特定于应用程序的配置。 但它必须是:
- 可在任何文件(模型,视图,帮助器和控制器)中访问
- 指定(或不指定)环境,这意味着每个环境都可以覆盖environment.rb中指定的配置
我试过使用environment.rb并添加类似的东西
USE_USER_APP = true
这对我有用但是当试图在特定环境中覆盖它时它不会工作,因为例如,production.rb似乎在Rails:Initializer.run块中。
那么,有人吗?
我帮助一位朋友设置了里卡多昨天提到的解决方案 。 我们通过加载类似于此的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
看看Configatron: http ://github.com/markbates/configatron/tree/master
我还没有使用它,但他现在正积极开发它,看起来很不错。
最基本的事情是从environment.rb设置一个类变量。 我已经为Google Analytics做了这个。 基本上我想要一个不同的密钥,具体取决于我所处的环境,因此开发或暂存不会偏差。
这就是我做到的。
在lib/analytics/google_analytics.rb
:
module Analytics class GoogleAnalytics @@account_id = nil cattr_accessor :account_id end end
然后在environment.rb
或environments/production.rb
或任何其他环境文件中:
Analytics::GoogleAnalytics.account_id = "xxxxxxxxx"
然后,您需要引用的任何地方,比如Google Analytics JavaScript的默认布局,您只需调用Analytics::GoogleAnalytics.account_id
。
我在这里找到了一个好方法
使用环境变量。 Heroku使用这个。 请记住,如果您在代码库中保留配置,任何有权访问代码的人都可以访问任何秘密配置(aws api密钥,网关API密钥等)。
daemontool的envdir是一个设置配置的好工具,我很确定Heroku使用它来为应用程序提供环境变量。
我使用了Rails设置缓存 。
它使用起来非常简单,可以缓存配置值并允许您动态更改它们。