我有一个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
答案 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"