#ruby-on-rails #ruby #ruby-on-rails-5.2
#ruby-on-rails #ruby #ruby-on-rails-5.2
Вопрос:
Я столкнулся с проблемой при загрузке переменной среды в boot.rb. Я пробовал использовать 2 драгоценных камня dotenv и dotenv-rails, но ни один из них не сработал для меня. В других местах я могу использовать переменную среды, но не в boot.rb. У кого-нибудь есть какие-либо подсказки по этому вопросу
if ["development"].include?(ENV['RAILS_ENV'])
require 'bootsnap/setup'
Bootsnap.setup(
cache_dir: 'tmp/cache', # Path to your cache
development_mode: 'development', # Current working environment, e.g. RACK_ENV, RAILS_ENV, etc
load_path_cache: true, # Optimize the LOAD_PATH with a cache
autoload_paths_cache: true, # Optimize ActiveSupport autoloads with cache
compile_cache_iseq: true, # Compile Ruby code into ISeq cache, breaks coverage reporting.
compile_cache_yaml: true # Compile YAML into a cache
)
end
Комментарии:
1. Вы не сказали, что это за содержимое
RAILS_ENV
, но поскольку ваш массив содержит только один элемент ("development"
) , вы можете переписать свое условие наif ENV['RAILS_ENV'] == "development"
. Это то же самое, что и ваш текущий код, но его легче понять.2. RAILS_ENV=development задается в файле .env
3. Возможно, но до какого значения? Кроме того, вы уверены, что
.env
файл был обработан при выполнении этого кода? Я предлагаю распечатать это значение для отладки.4. Я пытаюсь отладить значение ENV[‘RAILS_ENV’], оно дает ноль. Но когда я проверяю в консоли rails или где-либо в приложении, он выдает мне правильное значение. Я подозреваю, что во время загрузки файл .env не загружается
5. Тогда я проголосовал за закрытие вопроса.
Ответ №1:
DotEnv загрузит ваш .env
файл в env только после загрузки Gem.
В Rails это делается с помощью строки Bundler.require(*Rails.groups)
in config/application.rb
. Если вам нужно получить доступ к переменным env до этого, вам нужно вручную вызвать Dotenv::Railtie.load
:
Bundler.require(*Rails.groups)
Dotenv::Railtie.load
Или, по крайней мере, это то, что readme заставит вас поверить. Я думаю, вместо Railtie вы могли бы использовать простой подход ruby:
require 'dotenv'
Dotenv.load
Но есть множество вариантов установки переменных ENV из файла, такого как direnv, который не является драгоценным камнем Ruby и подключается к самой вашей оболочке.
Комментарии:
1. Спасибо, это не сработало так, но это дало мне подсказку. Когда я добавил Dotenv::Railtie. загрузка в application.rb это был частный метод `load’, вызванный для Dotenv::Railtie:Class. Затем я снова попробовал ту же строку в boot.rb, но это все равно не сработало. Позже то, что я попробовал с этими двумя строками в boot.rb, и это сработало, требует ‘dotenv’ Dotenv.load
2. Я предполагаю, что документы тогда сломаны. Я не использовал dotenv годами.
direnv
выполняет эту работу и позволяет избежать загромождения вашего gemfile тем, что на самом деле является специфичным для машины инструментом.
Ответ №2:
Вы можете использовать — в зависимости от ваших потребностей — load
или require
для явной обработки вашего .env
файла перед тестированием переменной среды.