Rails 开发和生产环境下的初始化程序

17

我有以下代码在/config/initializers/chargify.rb中。

Chargify.configure do |c|
  c.subdomain = 'example'
  c.api_key   = '123xyz'
end

但是我在开发和生产环境中有不同的设置。

那么,我如何根据不同的环境设置一组不同的变量值呢?


Josh,这是Baremetrics的MVP吗?历史正在此刻创造 :) - Jan Klimo
1
@JanKlimo 哈哈,不是啦。这是在 Baremetrics 还没有在我脑海中形成想法的三年前。:P - Shpigford
4个回答

29

我会为此创建一个配置文件 (config/chargify.yml):

development:
  subdomain: example
  api_key: 123abc
production:
  subdomain: production_domain
  api_key: 890xyz

然后将您的初始值设定程序更改为以下内容:

chargify_config_file = File.join(Rails.root,'config','chargify.yml')
raise "#{chargify_config_file} is missing!" unless File.exists? chargify_config_file
chargify_config = YAML.load_file(chargify_config_file)[Rails.env].symbolize_keys

Chargify.configure do |c|
  c.subdomain = chargify_config[:subdomain]
  c.api_key   = chargify_config[:api_key]
end

1
对于从上面复制和粘贴的人,快速警告:sudomain: example 应该是 subdomain: example - Jules Copeland

5

关于这个问题:

Chargify.configure do |c|
  if Rails.env.production?
    # production settings
    c.api_key   = '123xyz'
  else
    # dev. and test settings
    c.api_key   = '123xyz'
  end
end

更好的是,您可以使用case块来减少重复代码:
Chargify.configure do |c|
  c.subdomain = 'example'
  c.api_key   = case
    when Rails.env.production?
      '123xyz'
    when Rails.env.staging?
      'abc123'
    else
      'xyz123'
    end
end

4
如果您需要在不同的环境中使用不同的设置,最好将它们放在相应的环境文件中,例如config/environments/development.rb
如果您坚持要将它们放在初始化程序中(但请不要这样做,因为环境文件就是为此而存在的),您可以使用case语句并检查Rails.env的值,该值返回当前环境的名称作为字符串。

在application.rb中的注释中,不要将配置放在那些文件中,而是将其放在initializers目录中的文件中。 - Stewart Johnson

1
我建议您使用环境变量。
Chargify.configure do |c|
  c.subdomain = ENV['APP_SUBDOMAIN']
  c.api_key = ENV['API_KEY']
end

并在 ~/.bashrc 或 ~/.profile 中设置适当的变量,但请注意:这必须为与 Rails 实例操作相同的用户设置。例如,如果您在部署中使用了 capistrano 指定的部署用户,则必须设置该用户。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接