【问题标题】:Heroku needs different code to set environmental variable but why?Heroku 需要不同的代码来设置环境变量,但为什么呢?
【发布时间】:2015-02-21 07:50:44
【问题描述】:

我第一次对我已经解决的答案有疑问,这更多是关于为什么我的小修复首先解决了它。

我正在学习 Daniel Kehoe 的 Learn Rails 书籍教程,创建了一个应用程序,该应用程序应该为人们订阅 MailChimp 列表。我正在使用 Gibbon gem,在本书中,这是模型中用于设置变量的(部分)代码:

def subscribe
  mailchimp = Gibbon::API.new(Rails.application.secrets.mailchimp_api_key)
  result = mailchimp.lists.subscribe({
    :id => Rails.application.secrets.mailchimp_list_id,
  <more code here for email and stuff>
end

我的相关变量的 secrets.yml 文件如下所示:

mailchimp_api_key: <%= ENV["MAILCHIMP_API_KEY"] %>
mailchimp_list_id: <%= ENV["MAILCHIMP_LIST_ID"] %>

而且,因为我在 Windows 上,所以我在 application.yml 中设置了它们的实际值:[编辑:正如人们所指出的,这来自 Figaro gem,可能是也可能不是教程的一部分]

MAILCHIMP_API_KEY: mysecretkey
MAILCHIMP_LIST_ID: mysecretid

我应该指出,这在本地工作得非常好。我可以运行我的服务器并订阅。但是,将其推送到 Heroku 并通过heroku config:set MAILCHIMP_API_KEY=mysecretkey 设置 ENV 变量,MAILCHIMP_LIST_ID 也是如此,它不起作用。更具体地说,它返回错误Invalid Mailchimp List ID:。

因此,尽管设置了它并检查了它是否已实际设置,但对于列表 ID,它根本没有任何价值。

我通过搜索 Heroku 自己的关于 Config Vars 的帮助文本解决了这个问题,它建议如下:“设置您的代码以在运行时读取 vars。例如,在 Ruby 中,您可以使用以下方式访问环境变量ENV['KEY'] 模式"

我更改了模型中的代码,所以现在不是使用Rails.application.secrets.mailchimp_list_id,而是这样:

def subscribe
  mailchimp = Gibbon::API.new(Rails.application.secrets.mailchimp_api_key)
  result = mailchimp.lists.subscribe({
    :id => ENV['MAILCHIMP_LIST_ID'],
  <more code here for email and stuff>
end

而且,您知道吗,它在 Heroku(和本地)中有效!为什么呢?我的意思是,它确实理解 API 密钥的相同类型的代码,但不理解列表 ID,这对我来说似乎很奇怪。另外,为什么有问题的书没有反映这一点?作者似乎愿意定期更新它,我看到他以一种近乎虔诚的奉献精神回答有关它的问题。我是唯一遇到这个问题的人吗?

编辑:在下面解决。我现在觉得有点傻,和往常一样,事情有一个非常简单的解决方案。我会注意到这本书实际上确实在 secrets.yml 文件中将密钥复制到了生产环境中,我只是错过了那部分,可能是因为我必须找到一个替代解决方案来解决整个环境变量问题并使用 Figaro gem。如果我对这本书有任何批评,那就是它不适合我们这些可怜的 Windows 用户。 :)

【问题讨论】:

    标签: ruby-on-rails heroku mailchimp gibbon learn-ruby-on-rails


    【解决方案1】:

    Figaro 创建config/application.yml 文件和according to its documentation,将其添加到您的.gitignore:

    这会创建一个带注释的 config/application.yml 文件并将其添加到您的 .gitignore。将您自己的配置添加到此文件中,您就完成了!

    这样做是为了防止敏感的机密(如密码和盐)被提交到您的 Git 存储库中,而这些机密会被泄露。

    Figaro does have a feature which you can use to transfer all the settings in application.yml 通过运行立即到 Heroku

    figaro heroku:set -e production
    

    事实证明,config/secrets.yml 没有在生产部分重复 Mailchimp 密钥。要解决这个问题,它应该如下所示:

    development:
      mailchimp_api_key: <%= ENV["MAILCHIMP_API_KEY"] %>
      mailchimp_list_id: <%= ENV["MAILCHIMP_LIST_ID"] %>
    
    production:
      mailchimp_api_key: <%= ENV["MAILCHIMP_API_KEY"] %>
      mailchimp_list_id: <%= ENV["MAILCHIMP_LIST_ID"] %>
    

    【讨论】:

    • 啊,是的。我忘记了 Figaro 是否是教程的一部分……我记得在使用 Windows 时遇到了很多 ENV 变量问题。但是,这如何准确解释我的问题?为什么我的应用程序在本地运行,而不是在 Heroku 上使用旧代码?
    • 我已经在一个新段落中强调了确切的原因。由于它被 Git 忽略,它不会被推送到任何远程,包括 Heroku。
    • 不,我明白了。这与使用 bashrc 文件或其他名称没有什么不同,后者也不会被推送到 Heroku。我通过 heroku config:set 设置变量,所以没关系。毕竟,它确实获得了我的 API 密钥,但没有获得列表 ID。编辑:事实上,它获取了我所有的变量,只是不明白我希望使用旧代码语法访问它。
    • 啊,我明白你的意思了。它应该与您发布的旧版本一起使用,我在那里找不到任何问题。您是否尝试将其改回旧代码以查看它现在是否可以在 Heroku 上运行?
    • 现在试过了。同样的错误:Gibbon::MailChimpError (Invalid MailChimp List ID: )。我很高兴其他人也对此感到困惑!
    【解决方案2】:

    几乎完全相同的错误,但原因略有不同。

    仔细检查以确保您的 secrets.yml 配置正确。我的如下所示:

    ...
    production:
      mailchimp_api_key: <%= ENV["MAILCHIMP_API_KEY"] %>
      mailchimp_list_id: ENV["MAILCHIMP_LIST_ID"]
    ...
    

    在多次扫描文件后,我没有看到丢失的 ,即使在我最终到达此页面之后也是如此。我会留下这个答案,以防 Google 在这里发送其他有相同错字的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-03
      • 1970-01-01
      • 2016-01-17
      • 1970-01-01
      • 2015-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多