Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Heroku需要不同的代码来设置环境变量,但为什么?_Ruby On Rails_Heroku_Mailchimp_Gibbon_Learn Ruby On Rails - Fatal编程技术网

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

Ruby on rails Heroku需要不同的代码来设置环境变量,但为什么?,ruby-on-rails,heroku,mailchimp,gibbon,learn-ruby-on-rails,Ruby On Rails,Heroku,Mailchimp,Gibbon,Learn Ruby On Rails,这是我第一次对我已经解决的答案提出问题,更多的是关于为什么我的小补丁首先解决了这个问题 我遵循Daniel Kehoe的LearnRails书籍教程,创建了一个应用程序,该应用程序应该为人们订阅邮件黑猩猩列表。我使用的是Gibbon gem,在书中,这是(部分)用于设置变量的模型代码: def subscribe mailchimp = Gibbon::API.new(Rails.application.secrets.mailchimp_api_key) result = mailch

这是我第一次对我已经解决的答案提出问题,更多的是关于为什么我的小补丁首先解决了这个问题

我遵循Daniel Kehoe的LearnRails书籍教程,创建了一个应用程序,该应用程序应该为人们订阅邮件黑猩猩列表。我使用的是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
我应该注意到,这在本地非常有效。我可以运行我的服务器并订阅。但是,将其推送到Heroku并通过Heroku配置:set-MAILCHIMP_API_KEY=mysecretkey设置环境变量,对于
MAILCHIMP_LIST_ID
,同样的操作是无效的。更具体地说,它返回错误
无效的Mailchimp列表ID:

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

我通过搜索Heroku自己关于配置变量的帮助文本修复了这个问题,其中建议如下:“设置代码以在运行时读取变量。例如,在Ruby中,使用
ENV['KEY']
模式访问环境变量”

我在模型中更改了代码,因此不再使用
Rails.application.secrets.mailchimp\u list\u 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
def订阅
mailchimp=Gibbon::API.new(Rails.application.secrets.mailchimp\u API\u key)
结果=mailchimp.lists.subscribe({
:id=>ENV['MAILCHIMP_LIST_id'],
结束
而且,你知道吗,它在Heroku(和本地)起作用!为什么?我的意思是,它确实理解API键的相同代码,但不理解列表ID的相同代码,这对我来说似乎很奇怪。而且,为什么这本书没有反映这一点?作者似乎愿意定期更新它,我看到他以近乎宗教般的虔诚回答有关它的问题。我是唯一一个运行int的人吗o这个问题


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

Figaro创建了
config/application.yml
文件,并将其添加到您的
.gitignore

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

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

application.yml
中,通过运行

figaro heroku:set -e production
事实证明,
config/secrets.yml
没有重复生产部分中的Mailchimp键。要解决这个问题,应该如下所示:

mailchimp_api_key: <%= ENV["MAILCHIMP_API_KEY"] %>
mailchimp_list_id: <%= ENV["MAILCHIMP_LIST_ID"] %>
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_api_密钥:
mailchimp\u列表\u id:
制作:
mailchimp_api_密钥:
mailchimp\u列表\u id:

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

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

...
production:
  mailchimp_api_key: <%= ENV["MAILCHIMP_API_KEY"] %>
  mailchimp_list_id: ENV["MAILCHIMP_LIST_ID"]
...
。。。
制作:
mailchimp_api_密钥:
mailchimp_列表_id:ENV[“mailchimp_列表_id”]
...

在扫描了很多次文件后,我没有看到丢失的内容,即使我在这个页面上结束了。我将保留这个答案,以防谷歌发送其他人在这里使用相同的打字错误。

啊,是的。我忘记了Figaro是否是教程的一部分……我记得在使用Windows时,环境变量遇到了很多问题。但是,我是如何做到的这能准确地解释我的问题吗?为什么我的应用程序在本地工作,而不是在Heroku上使用旧代码?我在一个新的段落中强调了确切的原因。因为它被Git忽略了,所以它不会被推送到任何远程,包括Heroku。不,我明白了。它与使用bashrc文件或任何它被调用的东西没有什么区别,也不会得到pushed to Heroku。我通过Heroku config:set设置变量,所以这不重要。它确实得到了我的API密钥,但毕竟不是列表ID。Edit:事实上,它得到了我所有的变量,它只是不理解我希望用旧代码语法访问它。啊,现在我明白你的意思了。它应该在你发布它时使用旧代码,我不能发现任何问题。您是否尝试将其更改回旧代码以查看它现在是否在Heroku上工作?现在尝试。相同的错误:
Gibbon::MailChimpError(无效的MailChimp列表ID:)
。我很高兴其他人也被这一点弄糊涂了!
...
production:
  mailchimp_api_key: <%= ENV["MAILCHIMP_API_KEY"] %>
  mailchimp_list_id: ENV["MAILCHIMP_LIST_ID"]
...