これはなに?
Railsにて、条件分岐を環境変数でおこなおうと考えました。
このときに上手くいかなかった理由を深堀りし、より良い方法を学んだのでそのメモです。
やりたいこと
環境変数にHOGE=true
を設定し、以下のようなコードで条件分岐させることを目標とします。
if # ENV[HOGE]がtrue
# なんらかの処理
end
やったこと
間違いパターン
if ENV['HOGE'] == true
puts "HOGE is true"
end
# "HOGE is true"は出力されない
このコードでは、if節はfalseを返します。
一見すると不思議です。
コンソールでENV['HOGE']
そのものの真偽値はtrueを返すのに、なぜでしょう?
!!ENV['HOGE']
=> true
その理由は、環境変数から取得される値はすべて文字列として扱われるためです。
.envファイルでHOGE=true
と設定した場合でも、ENV['HOGE']
は "true"
のような文字列として返されます。
これはRubyのtrue(ブーリアン値)とは異なります。
ENV['HOGE']
=> "true"
!!("true" == true)
=> false
!!(ENV['HOGE'] == true)
=> false
正解パターン
ENVで取得する値は文字列で返されるため、if節の条件値も文字列にする必要があります。
つまり、第一段階として以下の形式をとる必要があります。
if ENV['HOGE'] == 'true'
puts "HOGE is true"
end
# "HOGE is true"が出力される
ここで終わらずに、更にコードをレベルアップします。
結論から言うと、以下のようなコードにしました。
if ENV.fetch('HOGE', 'false').downcase == 'true'
puts "HOGE is true"
end
# "HOGE is true"が出力される
この方法では、まず ENV.fetch メソッドを使って環境変数HOGE
の値を取得します。
このとき環境変数が存在しなければ、.fetch
メソッドの第二引数に設定した'false' をデフォルト値として返します。
その後 .downcase
メソッドで取得した文字列を小文字に変換します。
これにより、環境変数の値が"TRUE", "True", "true"など、大文字小文字に関わらず一貫した比較が可能になります。