我使用的是Figaro gem,但只有在我访问config/database.yml
内的env变量时才会有效:
<%= ENV["MYSQL_USERNAME"] %>
但不是当我按照文档指定的方式尝试时:
ENV["MYSQL_USERNAME"]
或
Figaro.env.mysql_username
有谁知道为什么会这样?
答案 0 :(得分:7)
Figaro Gem's 官方文档明确说明(参见&#34;给我一个例子&#34;部分)以下内容:
注意:费加罗使用Rails&#39;标准钩子初始化。不幸的是,这个钩子显然发生在读取database.yml之后。 由于这个问题,创建了环境变量 application.yml不在database.yml。
中工作
经过进一步调查,我发现对此提出的问题很少。 Steve Richert(Figaro Gem的创建者,#34; laserlemon&#34; Github id)在 issue #70
上说这个这是一个已知问题。我们使用Rails&#39;标准钩子初始化 在Rails初始化之前的费加罗。不幸的是,这个钩子显然 读取database.yml后发生。试图规避标准 挂钩和绑在Rails&#39;在其他地方初始化引入主机 新问题并且很难解释每一个问题 加载Rails环境的情况。我害怕这个 陷入了“不会解决问题”的问题。直到Rails提供更好的(和 支持)费加罗可以绑成的钩子......
<强>更新强>:
根据 pull request #100 ,database.yml配置正在使用两个Rails(如4.0和4.1)和Figaro的最新版本。
最后,我强烈建议阅读Taylor Mock和Daniel Kehoe的Rails Environment Variables 指南。这是所有RoR开发人员必读的内容。
答案 1 :(得分:4)
他们的文件错了。如果要将非静态值插入YAML文件,则必须使用ERB标记。 YAML文件通常只是静态文件。 Rails通过ERB解析器处理database.yml
,这就是你可以使用ERB语法插值的原因。
换句话说:如果你不使用ERB标签,Rails不知道它是否应该评估你输入的内容,或者它是否应该将其视为静态值
答案 2 :(得分:1)
如果您在ENV["MYSQL_USERNAME"]
文件中访问ERB
,那么显然您需要使用<%= %>
来评估和打印评估的ruby代码。
如果您在没有ENV["MYSQL_USERNAME"]
的情况下简单地使用<%= %>
,则ERB模板引擎不会解释它。它将被视为plain text
。
修改强>
您的问题最初未指定您访问ENV["MYSQL_USERNAME"]
的位置(稍后在对我的回答发表评论后添加)这就是为什么我认为它在ERB文件中。
在任何.rb
文件中,您无需在访问<%= %>
时指定ENV
。但您确实需要指定它们才能在.yml
或.erb
文件中进行访问。