【发布时间】: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