在 Rails 中存储应用程序特定配置的最佳方法是什么?
-
02-07-2019 - |
题
我需要在 Rails 中存储应用程序特定的配置。但它必须是:
- 可在任何文件(模型、视图、助手和控制器)中访问
- 指定(或未指定)环境,这意味着每个环境都可以覆盖environment.rb中指定的配置
我尝试使用environment.rb并放置类似的内容
USE_USER_APP = true
这对我有用,但是当尝试在特定环境中覆盖它时,它不会工作,因为例如 production.rb 似乎位于 Rails:Initializer.run 块内。
那么,有人吗?
解决方案
我正在帮朋友设置 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
其他提示
看看Configatron: http://github.com/markbates/configatron/tree/master
我还没有使用它,但他现在正在积极开发它,而且看起来相当不错。
最基本的事情是从环境中设置一个类变量。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 设置已缓存.
它使用起来非常简单,可以缓存您的配置值并允许您动态更改它们。