如何正确存储和访问全局应用配置设置?

时间:2016-11-22 18:25:08

标签: ruby-on-rails ruby-on-rails-4

在撰写rails 4应用程序的原因我最近一直在想知道存储自定义配置信息的位置和方式?具体来说,我的意思是应用程序标题特殊电子邮件地址,可能主题选项等等我想在整个应用程序中使用任一环境引用变量或其他构造。我一直在挖掘一下 - 在部署之前 - 最终使用了一个漂亮的初始化程序来创建一个像这样的OpenStruct

require 'ostruct'                                                                                                                                                                    

all_config = YAML.load_file("#{Rails.root}/config/app_config.yml") || {}
env_config = all_config[Rails.env] || {}
AppConfig = OpenStruct.new(env_config)

读取以下yaml文件(app_config.yml)

default: &default                                                                                                                                                                    
  general:
    app_title: MyName
    maintainer_email_address: someone@somewhere.org

development:
  <<: *default

test:
  <<: *default

production:
  <<: *default

在开发中,我很高兴访问我必须通过AppConfig.general.*访问的所有内容,但不幸的是,这在生产中无效,尝试启动服务器/控制台最终会引发Uninitialized constant AppConfig - 错误

现在我有两到三个问题:

1)我可以假设这在生产中不起作用,因为文件的加载顺序,production.rb在初始化程序之前加载( - &gt; AppConfig作为全局变量不存在)

2)如果是:为什么这项工作正在开发中?那里有什么不同?

3)存储上述信息的好习惯是什么?我的愿望是能够通过某种用户/管理界面轻松获取和设置这些信息。从那里我不想太乱用我的环境文件......

好吧,我希望有人可以帮助我,提前谢谢! 岸堤

1 个答案:

答案 0 :(得分:1)

RAILS_ROOT/config目录中添加配置文件。

# config/foo.yml
development:
 api_key: 'my_development_api_key'

staging:
  api_key: <%= ENV['API_KEY'] %>

production:
  api_key: <%= ENV['API_KEY'] %>

RAILS_ROOT/config/initializers目录

中添加初始化程序文件
# config/initializers/foo.rb
foo_config = Rails.application.config_for(:foo)

Rails.application.configure do
  config.foo = ActiveSupport::OrderedOptions.new
  config.foo.api_key = foo_config[:api_key]
end

在代码中使用您的配置。

Rails.configuration.foo.api_key

有时您无法在代码中提交密钥和其他凭据。在这种情况下,请使用环境变量。我使用dotenv gem来管理环境变量。