5

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

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

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

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

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

秘密.yml

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

应用程序.yml

development:
  ACCOUNT_ID: "123456"

应用程序.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
4

2 回答 2

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"]将在开发中产生“开发者”,在生产中产生“用户”,否则产生“世界”。

于 2015-04-29T15:44:36.400 回答
1

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

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

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

更一般地说,如果您不确定在给定环境中设置了哪些环境变量,最简单的仔细检查方法是打开 Rails 控制台并ENV像这样查询:

$ rails console
> puts ENV.keys # find out what ENV vars are set
=> (returns a long list of var names)
> puts ENV['DEVISE_PEPPER']
=> "067d793e8781fa02aebd36e239c7878bdc1403d6bcb7c380beac53189ff6366be"
于 2015-04-29T17:23:33.440 回答