48

在我的 settings.yml 文件中,我有几个配置变量,其中一些引用了 ENV[] 变量。

例如我有 ENV['FOOVAR'] 等于 WIDGET

我以为我可以像这样在 <% %> 中引用 ENV vars:

设置.yml:

default:
   cv1: Foo
   cv2: <% ENV['FOOVAR'] %>

如果我输入,在 Rails 控制台中

> ENV['FOOVAR']
=> WIDGET

> Settings.cv1
=> Foo   (works okay)
> Settings.cv2
=>nil   (doesn't work???)
4

4 回答 4

68

使用以下: -

 default:
       cv1: Foo
       cv2: <%= ENV['FOOVAR'] %>
于 2011-05-03T07:10:58.043 回答
31

上述解决方案对我不起作用。但是,我找到了 如何在 YAML 文件中使用变量的解决方案?

我的 .yml 文件包含以下内容:

development:
gmail_username: <%= ENV["GMAIL_USERNAME"] %>
gmail_password: <%= ENV["GMAIL_PASSWORD"] %>

解决方案如下所示:

template = ERB.new File.new("path/to/config.yml.erb").read
processed = YAML.load template.result(binding)

因此,当您在 .yml 文件中引入 scriptlet 标签时,它更像是 erb 模板。所以先把它作为一个erb模板读取,然后如上图加载yml。

于 2014-09-16T06:42:42.160 回答
24

使用<%= ENV['FOOVAR'] %>而不是<% ENV['FOOVAR'] %>.

请注意,这种方法只有在解析 Yaml 文件的任何东西都设置为通过 Erb 处理它时才有效(例如,您可以看到Mongoid 是如何做到这一点的)。不过,它在 Yaml 文件中并未得到普遍支持,因此这取决于您使用此 Yaml 文件的目的。

于 2011-05-03T07:11:28.240 回答
0

我能够用简单的代码解决这个问题

data = {}
YAML.load_file("path_of_file/settings.yml").each do |key, value|
  data[key] = ENV[value] || value
end 

我的数据是这样的

account: ACCOUNT_USERNAME
password: ACCOUNT_PASSWORD
port: 5002

和是ACCOUNT_USERNAME环境ACCOUNT_PASSWORD变量

于 2020-08-07T22:57:12.493 回答