LoginSignup
1
0

【Rails】環境変数で条件分岐するときの小ネタ

Posted at

これはなに?

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"など、大文字小文字に関わらず一貫した比較が可能になります。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0