使用Figaro和Secrets.yml管理Env变量

时间:2015-04-29 15:33:38

标签: ruby-on-rails ruby-on-rails-4 environment-variables figaro-ruby

我有一个rails 4.1应用程序,我正在尝试组织我的env变量。截至目前,我的config /文件夹中有一个secrets.yml文件。我还安装了figaro宝石。我的目标是将所有我的env变量放在application.yml(未检入git)文件中,然后使用secrets.yml(签入git)文件将变量从appliation.yml映射到应用程序。当我使用Rails.application.secrets打印文件时它只显示如下所示的哈希:

:salesforce_username=>"ENV['SALESFORCE_USERNAME']"

我的所有外部服务都没有使用此env变量设置。当我查看跟踪时,实际的ENV ['ACCOUNT_ID']正在这样的请求中传递:

v2/accounts/ENV['ACCOUNT_ID']/envelopes

另外,我无法在我的应用程序中使用Rails.application.secrets.account_id访问我的env变量。

secrets.yml

development:
  account_id: <%= ENV['ACCOUNT_ID'] %>

aplication.yml

development:
  ACCOUNT_ID: "123456"

application.rb中

# preload tokens in application.yml to local ENV
config = YAML.load(File.read(File.expand_path('../application.yml', __FILE__)))
config.merge! config.fetch(Rails.env, {})
config.each do |key, value|
  ENV[key] = value.to_s unless value.kind_of? Hash
end

2 个答案:

答案 0 :(得分:11)

gem提供了一个生成器:

$ rails generate figaro:install

生成器创建 config / application.yml 文件并修改 .gitignore 文件,以防止将文件签入git存储库。

您可以将键/值对的环境变量添加到 config / application.yml

GMAIL_USERNAME: Your_Username

环境变量将作为ENV变量在应用程序的任何位置使用:

ENV["GMAIL_USERNAME"]

这使您可以方便地在代码中使用相同的变量,无论它们是由Unix shell还是figaro gem的 config / application.yml 设置的。 config / application.yml 文件中的变量将覆盖Unix shell中设置的环境变量。

在ENV变量可能不合适的测试或其他情况下,您可以像Figaro方法调用一样访问配置值:

Figaro.env.gmail_username

使用此语法在开发,测试或生产环境中设置不同的凭据:

HELLO: world
development:
  HELLO: developers
production:
  HELLO: users

在这种情况下,ENV["HELLO"]将在开发中产生“开发者”,在生产中产生“用户”,否则产生“世界”。

答案 1 :(得分:-1)

你说ENV变量正在“在请求中传递”,但是当我查看你的代码片段时,我认为这些变量一开始并没有被检测到。

如果要将变量注入字符串,请仔细检查您是否使用以下格式,尤其是#{}

important_string = "v2/accounts/#{ENV['ACCOUNT_ID']}/envelopes"

更一般地说,如果您不确定在给定环境中设置了哪些环境变量,最简单的方法是打开Rails控制台并查询ENV,如下所示:< / p>

$ rails console
> puts ENV.keys # find out what ENV vars are set
=> (returns a long list of var names)
> puts ENV['DEVISE_PEPPER']
=> "067d793e8781fa02aebd36e239c7878bdc1403d6bcb7c380beac53189ff6366be"