Heroku нужен другой код для установки переменной среды, но почему?
Впервые у меня есть вопрос к ответу, который я уже решил, это больше о том, ПОЧЕМУ мое маленькое исправление решило его в первую очередь.
Я следую учебному пособию по Learn Rails Дэниелу Кехо, создающему приложение, которое должно подписывать людей на список MailChimp. Я использую самоцвет Гиббона, и в книге это (часть) код в модели, используемой для установки переменных:
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 и установив переменные ENV через heroku config:set MAILCHIMP_API_KEY=mysecretkey
и то же самое для MAILCHIMP_LIST_ID
не работает Точнее, возвращает ошибку Invalid Mailchimp List 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, но не для идентификатора списка, что мне кажется странным. Кроме того, почему рассматриваемая книга не отражает это? Автор, кажется, готов обновлять его очень регулярно, и я вижу, как он отвечает на вопросы с почти религиозной преданностью. Я единственный, кто столкнулся с этой проблемой?
Изменить: решено ниже. Сейчас я чувствую себя немного глупо, и, как обычно, у вещей есть очень простое решение. Отмечу, что в книге действительно были продублированы ключи в файле secrets.yml, я просто пропустил эту часть, вероятно потому, что мне пришлось искать альтернативное решение всей проблемы переменных среды и использовать драгоценный камень Figaro. Если у меня есть какая-то критика книги, то она не предназначена для нас, бедных пользователей Windows.:)
2 ответа
Фигаро создает config/application.yml
файл и в соответствии с документацией добавляет его в свой .gitignore
:
Это создаст закомментированный файл config/application.yml и добавит его в ваш.gitignore. Добавьте свою конфигурацию в этот файл, и все готово!
Это сделано для предотвращения передачи секретных секретов (таких как пароли и соли) в ваш репозиторий Git, где эти секреты могут быть скомпрометированы.
В Figaro есть функция, с помощью которой вы можете перенести все настройки в application.yml
Героку сразу же, запустив
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"] %>
Была почти та же самая ошибка, но немного другая причина.
Дважды проверьте, чтобы убедиться, что ваш secrets.yml правильно настроен. Мой выглядел следующим образом:
...
production:
mailchimp_api_key: <%= ENV["MAILCHIMP_API_KEY"] %>
mailchimp_list_id: ENV["MAILCHIMP_LIST_ID"]
...
Я не видел пропавших <% =%> после сканирования файла МНОГИЕ раз, даже после того, как попал на эту страницу. Я оставлю этот ответ на тот случай, если Google отправит сюда других с такой же опечаткой.