1

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

我正在关注 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:

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

我通过在 Config Vars 上搜索 Heroku 自己的帮助文本解决了这个问题,它建议如下:“设置您的代码以在运行时读取 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 用户。:)

4

2 回答 2

1

Figaro 创建config/application.yml文件并根据其文档将其添加到您的.gitignore

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

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

application.ymlFigaro 确实有一个功能,您可以使用它通过运行一次将所有设置传输到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"] %>
于 2014-12-23T07:49:39.380 回答
0

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

仔细检查以确保您的 secrets.yml 配置正确。我的看起来像下面这样:

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

在多次扫描文件后,我没有看到丢失的 <%= %>,即使在我结束了这个页面之后也是如此。我会留下这个答案,以防谷歌在此处发送具有相同错字的其他人。

于 2016-08-02T16:07:33.497 回答