гем dotenv не получает переменные в Rails 6 или Ruby 2.6.5 - PullRequest
0 голосов
/ 06 ноября 2019

Я использовал dotenv gem для хранения переменных среды для разработки в файле секретов. Драгоценный камень больше не тянет переменные после обновления ruby ​​и rails на моем компьютере. Чтобы попытаться выяснить причину, и после некоторого времени попыток использовать различные варианты, я закончил тем, что создал два идентичных приложения с двумя отличиями. Рубиновые и рельсовые версии. Одно приложение может извлекать переменные среды, другое возвращает ноль. Какие-либо предложения?

Мои настройки

Рабочее приложение имеет

ruby "2.5.0"
gem 'rails',        '~> 5.1.6'

Нерабочее приложение имеет

ruby "2.6.5"
gem 'rails',        '~> 6.0.0'

ЧтоДо сих пор я пробовал

  • Я прочитал информацию на сайте драгоценного камня и попытался добавить Dotenv::Railtie.load в мой config/application.rb файл.
  • Также я попытался добавить require: 'dotenv/rails-now' в моем Gemfile на случай, если это было из-за другой проблемы с драгоценными камнями.
  • Я добавил require 'dotenv/load' к файлам, нуждающимся в переменных.
  • Я добавил 'require dotenv/load' в различные места в моем config/application.rb файле

Каждое изменение я делал индивидуально и использовал byebug , чтобы проверить в терминале, еслипеременная была загружена. И каждый раз переменная была еще nil.

Что-нибудь, чего мне не хватает? Какие-либо предложения? Или я должен перейти на другой драгоценный камень? Я слышал, что figaro может делать то же самое, просто никогда не использовал его раньше. Спасибо заранее за вашу помощь.

1 Ответ

0 голосов
/ 07 ноября 2019

Хорошо, я нашел способ заставить его работать. Не уверен, что мое объяснение ниже объяснит, почему gem dotenv не работает с Rails 6. Но теперь есть лучший способ сделать это в новейшей версии Rails.

Ссылка

Я нашел этот ответ благодаря этой записи в блоге Ромила Мехты ( В Rails 6 добавлена ​​поддержка учетных данных для нескольких сред )

Справочная информация

Похоже, что с Rails 5.2 мы смогли хранить учетные данные вместо секретов. Я не знал этого и продолжал использовать вышеупомянутый драгоценный камень.

Что происходит сейчас

Итак, при создании нового приложения RoR в приложении Rails создается файл config\credentials.yml.enc, зашифрованный с помощью мастер-ключа. находится в файле config\master.key. (ПРИМЕЧАНИЕ. Вам следует скрыть этот файл перед первым git commit или любым другим трекером версий, который вы можете использовать.)

Существует много способов отредактировать зашифрованный файл, чтобы добавить свои собственные переменные для разработки. Автор блога использовал эту строку консоли rails в качестве примера: EDITOR=vim rails credentials:edit. Я предпочитаю 'nano' в качестве редактора, поэтому я изменил строку консоли на: EDITOR=nano rails credentials:edit.

Новый путь

Из нано-оболочки файл credentials.yml.enc расшифровывается, и я могу его прочитать. Затем я добавил учетные данные, хранящиеся в моем файле секретов, к которому я пытался получить доступ во всем приложении. Примерно так:

oauth:   
   server_base_url: http://localhost:3000
   oauth_token: 123
   oauth_secret: 456

Раньше в моем приложении я ссылался на один из секретных ключей, просто вызывая ENV['variable_name'], как в ENV['server_base_url'] или ENV['oauth_token'], и получал бы вывод 'http://localhost:3000' или «123» соответственно. Теперь, чтобы сделать то же самое, мне нужно иметь код: Rails.application.credentials.section_name[:variable_name], где 'section_name' - это 'oauth' в моем списке выше, за которым следуют три имени переменных. Итак, для ссылки на 'oauth_token' я бы сделал: Rails.application.credentials.oauth[:oauth_token].

Как только я изменил все мои ENV звонки на код Rails.application.credentials, мое приложение заработало. Он извлек секретные переменные (теперь «учетные данные») и подключил мой пример приложения к oauth-серверу для авторизации входа в систему.

Резюме

Опять же, я не уверен, как это объясняет, почему гем 'dotenv' не работает в моих новых средах Ruby и Rails. Но, если у кого-то еще есть такая же проблема, вот обходной путь для вас! И поскольку это функция приложения RoR, это, вероятно, не обходной путь, а правильный способ кодирования вашего приложения.

Happy Coding!

...