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

时间:2020-03-06 14:29:56  来源:igfitidea点击:

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

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

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

USE_USER_APP = true

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

那么,有人吗?

解决方案

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

查看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"即可。

我正在帮助一个朋友建立里卡多昨天提到的解决方案。我们通过向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