为什么Figaro gem只有在我使用erb语法时才能工作?

时间:2014-03-31 15:26:20

标签: ruby-on-rails ruby-on-rails-4 erb

我使用的是Figaro gem,但只有在我访问config/database.yml内的env变量时才会有效:

<%= ENV["MYSQL_USERNAME"] %>

但不是当我按照文档指定的方式尝试时:

ENV["MYSQL_USERNAME"]

Figaro.env.mysql_username

有谁知道为什么会这样?

3 个答案:

答案 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文件中进行访问。