Heroku需要不同的代码来设置环境变量,但为什么呢?

时间:2014-12-23 07:22:08

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

我第一次对我已经解决的答案提出疑问,这更多的是为什么我的小修理首先解决了这个问题。

我遵循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

我所知道的变量的secretts.yml文件如下所示:

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

而且,因为我在Windows上,我在application.yml中设置它们的实际值:[编辑:正如人们所指出的,这来自费加罗的宝石,可能也可能不属于教程]

MAILCHIMP_API_KEY: mysecretkey
MAILCHIMP_LIST_ID: mysecretid

我应该注意到,这在当地完美无缺。我可以运行我的服务器并订阅。但是,将它推送到Heroku并通过heroku config:set MAILCHIMP_API_KEY=mysecretkeyMAILCHIMP_LIST_ID设置ENV变量,它不起作用。更具体地说,它返回错误Invalid Mailchimp List ID:

因此,尽管设置并检查它是否已实际设置,但它对列表ID的根本没有值

我通过在Config Vars上搜索Heroku自己的帮助文本来解决问题,在那里它推荐以下内容:&#34; 设置代码以在运行时读取变量。例如,在Ruby中,您可以使用ENV['KEY']模式&#34;

访问环境变量

我在模型中更改了代码,因此现在不再使用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 Key的相同类型的代码,但不了解列表ID,这对我来说似乎很奇怪。另外,这本书怎么没有反映出来呢?作者似乎愿意定期更新它,我看到他以几乎宗教的奉献精神回答问题。我是唯一一个遇到这个问题的人吗?

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

2 个答案:

答案 0 :(得分:1)

费加罗创建了config/application.yml文件和according to its documentation,并将其添加到您的.gitignore

  

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

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

通过运行

立即application.ymlfigaro heroku:set -e production 到Heroku
config/secrets.yml

事实证明,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"] %> 没有重复生产部分中的Mailchimp键。要解决这个问题,它应该如下所示:

{{1}}

答案 1 :(得分:0)

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

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

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

我没有看到丢失的&lt;%=%&gt;扫描文件很多次后,即使我在这个页面上结束。我会留下这个答案,以防Google在此处向其他人发送相同的拼写错误。

相关问题