【问题标题】:rails 3, how use an ENV config vars in a Settings.yml file?rails 3,如何在 Settings.yml 文件中使用 ENV 配置变量?
【发布时间】:2011-08-17 11:38:04
【问题描述】:

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

【问题讨论】:

标签: ruby-on-rails yaml env


【解决方案1】:

我可以用简单的代码解决这个问题

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

【讨论】:

  • 这不是一个可靠的解决方案。当 .yml 文件中的任何值意外匹配环境变量之一时,它可能会导致一些意外且难以捕捉的行为。而且您永远不知道应用程序将来会在哪个环境中运行。最好明确指定预期 ENV 变量的位置并使用 ERB 解析器。
【解决方案2】:

上述解决方案对我不起作用。但是,我找到了解决方案 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如上图。

【讨论】:

  • 配置文件不需要带有.erb扩展名,如果它被称为config.yml ,它也可以工作
【解决方案3】:

使用&lt;%= ENV['FOOVAR'] %&gt; 而不是&lt;% ENV['FOOVAR'] %&gt;

请注意,此方法仅在解析 Yaml 文件的任何内容设置为通过 Erb 处理它时才有效(例如,您可以看到 how Mongoid does exactly this)。不过,它在 Yaml 文件中并未得到普遍支持,因此这取决于您使用此 Yaml 文件的目的。

【讨论】:

    【解决方案4】:

    使用以下内容:-

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

    【讨论】:

    • 如果不将 .yml 添加为 .yml.erb 文件并添加代码 `template = ERB.new File.new("path/to/config.yml.erb ").read 处理 = YAML.load template.result(binding)'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2018-02-23
    • 2021-08-14
    • 1970-01-01
    • 2018-07-14
    相关资源
    最近更新 更多