Rails
spring

Railsで環境変数の変更が反映されないときはspring stopを試す

不具合

dotenvという、プロジェクトディレクトリの.envファイルに設定した内容を環境変数として読み込んでくれるgemを使っているのですが、.envの設定を変更しても想定した通りに挙動が変わらなかったためENV変数の中身を見てみると、.envを書き換えたにも関わらず何故か環境変数は元のまま書き換わっていない!ということがありました。

.envで

HOGE=0

HOGEを1に書き換えたのに

HOGE=1

なぜかHOGEは0のまま

[1] pry(main)> ENV['HOGE']
=> "0"

railsのサーバーは再起動させているはずだし、なんでだろうなんでだろう(古い)と隣の席の方に指示を仰いだところ、spring stopすると反映されるかもしれないとのことでしたので、試してみたところ無事環境変数が書き換わりました。よかったよかった。

環境変数の変更が反映されないときはspring stopを試す

SpringとはRails4.1から標準で付属するようになったアプリケーションプリローダーで、Railsアプリケーションをバックグラウンドでプリロードしておくことによりrailsコマンドの起動時間が短縮されるというものです。rails serverrails consoleなどのコマンドを実行すると同時に起動します。

このSpring、どうやらうまくリロードされていないのか、環境変数をキャッシュしてしまっているのか、環境変数の書き換えが反映されない原因となることが稀によくある(やや古い)ようです。

https://twitter.com/search?q=spring%20dotenv&src=typd
https://twitter.com/search?q=spring%20%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0&src=typd

また今回のケースとは異なりますが、Springのロード処理の失敗が原因でrailsコマンドが動かなくなってしまうこともあるようです。

Rail4で困ったらSpringを停止せよ
Rails コマンドが動かなくなった場合の対処
railsコマンドが固まったんでspringをstopしたら動くようになった
railsのコマンドが動かない時はspringを(stop|kill)してみよう

このようなケースに遭遇した時は、spring stopを試してみる、と覚えておくとよさそうです。