Torihaji's Growth Diary

Little by little, no hurry.

Railsで使うENV.fetchについて

はじめに

ENVの書き方の理解をミスっていたかもしれない。

ということで備忘録

※ 結論、大丈夫でした

何がミスってたか

RailsでよくENVがなかったら それ以外の値を使いたいという意図で

hoge = ENV['hoge'] ||  'default

という書き方をしていた。

しかしこれでは思わぬ挙動を示す。

falsyな値

そもそも Railsにおける || 演算子はどのような役割かというと

左辺を評価し、結果が真であった場合にはその値を返します。左辺の評価結果が偽であった場合には右辺を評価しその評価結果を返します。 or は同じ働きをする優先順位の低い演算子です

rubyにおける 偽の定義、falsyになりうる値はというと falseかnilということです。

ということは、つまりどういうことかというと

この時予期せぬ事態に

ENVの結果が仮にfalseであれば falseを取りたいのに 'default'が帰ってくるということ。

まぁENVにtrueを入れたいことなんてそんなないか?

そんな時のために

ENV.fetchを使う

ENV.fetch (Ruby 3.4 リファレンスマニュアル)

これであればたとえfalseであっても大丈夫

ENV.fetch('hoge', 'default')

と書いてもOK

企画倒れ

とやっていて rails cで時折確認しながらやっていたのですが

(app):24:in '[]=': no implicit conversion of false into String (TypeError)
    from (app):24:in '<main>'

ENVの= が 文字列に変換できないとダメそうですね。

つまり、falseが入れられないといことです。

よって、そもそも起こり得ないということでした。

ENV.=自体が valueを to_strによって暗黙に型変換?されるそうで。

docs.ruby-lang.org