我第一次对我已经解决的答案有疑问,这更多是关于为什么我的小修复首先解决了它。
我正在关注 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 用户。:)