執筆経緯
RailsでWebアプリを個人開発しているときの話です。
スケ少年は頭を抱えました。
database.ymlはどう書けばいいのだろうかと。ある記事では、ENV["HOGE"]
と書かれているし、またとある記事では、ENV.fetch("HOGE") { 'hoge' }
と書かれているし、うーん...一体全体、違いはなんなんだ!
ということで調べてみました。
本記事を読むことで達成できること
下記のようなコードの差異が理解できる、はず。
default: &default
adapter: mysql2
encoding: utf8
pool: <%= ENV["RAILS_MAX_THREADS"] %>
host: <%= ENV["DB_HOST"] %>
username: <%= ENV["DB_USERNAME"] %>
password: <%= ENV['DB_PASSWORD'] %>
default: &default
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
host: <%= ENV.fetch("DB_HOST") { 'db' } %>
username: <%= ENV.fetch("DB_USERNAME") { 'root' } %>
password: <%= ENV.fetch("DB_PASSWORD") { '' } %>
ENVとENV.fetchの違い
これらの記事を読めば分かる人にはわかります。
ENVについて
http://ruby-doc.org/core-2.6.3/ENV.html#method-c-5B-5D
ENV.fetchについて
http://ruby-doc.org/core-2.6.3/ENV.html#method-c-fetch
どちらもRubyのメソッドなんですが、要は、
-
ENV["HOGE"]
は、"HOGE"が存在しなかったらnilが返ってくる -
ENV.fetch("HOGE") { "hoge" }
は、"HOGE"が存在しなかったらデフォルト値で"hoge"が返ってくる
ってことです。
実際にconsole
で実験してみる。
env
でローカルでの環境変数一覧が出てきます。ENV、ENV.fetchは、これらを取ってくる。
まだ設定していない環境変数を実験として作成してみます。
touch test.rb
puts ENV["HOGE"] # HOGEがすでに設定されていたら、FUGAでもなんでもOK
puts ENV.fetch("HOGE") { "hoge_default" }
ruby test.rb
$ sample.rb
hoge_default
ENV["HOGE"]
の方はnil
なので何も表示されない。
これが環境変数HOGEが設定されていなかった場合。次に環境変数HOGEを設定した上で同じ操作を行う。
export HOGE="set hoge"
$ ruby sample.rb
set hoge
set hoge
違いがよくわかりましたね!
参考文献
https://stackoverflow.com/questions/47985660/rails-difference-between-env-fetch-and-env
http://ruby-doc.org/core-2.6.3/ENV.html#method-c-5B-5D
http://ruby-doc.org/core-2.6.3/ENV.html#method-c-fetch