rails 3,如何在Settings.yml文件中使用ENV配置变量?

时间:2011-05-03 06:44:23

标签: ruby-on-rails yaml env

在我的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???)

4 个答案:

答案 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_USERNAMEACCOUNT_PASSWORD是环境变量