質問: ### 現象 ・表題の通りです ### 現状認識 ・.env に、RAILS_ENV=production と書けば、rails コマンドに環境を明示しなくても、production 環境で動く ・環境変数 RAILS_ENV=production と設定しておけば、rails コマンドで、環境名を明示しなくても、環境変数の環境で動く ### わからない点 ・.env の環境変数はいつ読み込まれるのか ### 追記[わからない点2] ・rails コマンドは、.env の環境変数 RAILS_ENV に関係なく、デフォルトで development で動くものなのでしょうか? 根本の理解不足・認識違いがある気がしますが、よろしくお願いします。
回答: この問題に関するdotenvの作者の回答は > > Doubtful. It's a bit of a chicken-egg problem. > > > 鳥と卵の問題になるので怪しい。とのことです。 解説すると、dotenvはbundlerによって読み込まれます。 bundlerは環境によって読み込むgemを切り替えます。 ということは、bundlerからgemが読み込まれた時点で環境が決まっている必要があります。 なので、「dotenvからRAILS_ENVを上書きした場合、なんの問題もなく環境を切り替えられるかは怪しい」という事になります。 **追記:** ~~解決策っぽいものを見つけました。 以下をGemfileのrails直下あたりにgroup指定せずに記述するとよいでしょう。~~ dotenvの制限によりダメでした。 ``` gem 'dotenv-rails', require: 'dotenv/rails-now' ``` **再追記** 1. group指定せずに`gem dotenv-rails`を記述する。 2. `.env`に`RAILS_ENV=production`を記入 3. config/boot.rbを編集 ``` ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) require 'bundler/setup' # Set up gems listed in the Gemfile. # 追加 require 'dotenv' Dotenv.load require 'bootsnap/setup' # Speed up boot time by caching expensive operations. ``` というか、`config/boot.rb`冒頭にでも`ENV["RAILS_ENV"]="production"`を書くだけでいい気もしてます。