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

jpw*_*ynn 47 yaml env ruby-on-rails

在我的settings.yml文件中,我有几个配置变量,其中一些参考ENV []变量.

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

我以为我可以在<%%>里面引用ENV变量,如下所示:

settings.yml中:

default:
   cv1: Foo
   cv2: <% ENV['FOOVAR'] %>
Run Code Online (Sandbox Code Playgroud)

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

> ENV['FOOVAR']
=> WIDGET
Run Code Online (Sandbox Code Playgroud)

但

> Settings.cv1
=> Foo   (works okay)
> Settings.cv2
=>nil   (doesn't work???)
Run Code Online (Sandbox Code Playgroud)

Anu*_*haw 66

使用以下: -

 default:
       cv1: Foo
       cv2: <%= ENV['FOOVAR'] %>
Run Code Online (Sandbox Code Playgroud)

  • 如果您不将.yml添加为.yml.erb文件并添加代码`template = ERB.new File.new("path/to/config.yml.erb"),则此方法不起作用.read processed = YAML.加载template.result(绑定)' (6认同)

小智 27

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

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

development:
gmail_username: <%= ENV["GMAIL_USERNAME"] %>
gmail_password: <%= ENV["GMAIL_PASSWORD"] %>
Run Code Online (Sandbox Code Playgroud)

解决方案如下:

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

因此,当您在.yml文件中引入scriptlet标记时,它更像是erb模板.因此,首先将其作为erb模板阅读,然后如上所示加载yml.


Pre*_*ids 24

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

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