在我的settings.yml文件中,我有几个配置变量,其中一些参考ENV []变量。
例如我有ENV ['FOOVAR']等于WIDGET
我以为我可以在< %%>里面引用ENV变量像这样:
settings.yml中:
default:
cv1: Foo
cv2: <% ENV['FOOVAR'] %>
如果我输入,则在rails控制台中
> ENV['FOOVAR']
=> WIDGET
但是
> Settings.cv1
=> Foo (works okay)
> Settings.cv2
=>nil (doesn't work???)
答案 0 :(得分:63)
使用以下内容: -
default:
cv1: Foo
cv2: <%= ENV['FOOVAR'] %>
答案 1 :(得分:26)
上述解决方案对我不起作用。但是,我找到了解决方案 How do I use variables in a YAML file?
我的.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。
答案 2 :(得分:24)
使用<%= ENV['FOOVAR'] %>
代替<% ENV['FOOVAR'] %>
。
请注意,只有在解析Yaml文件的任何内容设置为通过Erb处理它时,此方法才有效(例如,您可以看到how Mongoid does exactly this)。它在Yaml文件中并不普遍支持,因此它取决于您使用此Yaml文件的内容。
答案 3 :(得分: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
是环境变量