Help us understand the problem. What is going on with this article?

ENV[]とENV.fetch()の違い【Rails/Ruby】

More than 1 year has passed since last update.

執筆経緯

RailsでWebアプリを個人開発しているときの話です。

スケ少年は頭を抱えました。

database.ymlはどう書けばいいのだろうかと。ある記事では、ENV["HOGE"]と書かれているし、またとある記事では、ENV.fetch("HOGE") { 'hoge' }と書かれているし、うーん...一体全体、違いはなんなんだ!

ということで調べてみました。

本記事を読むことで達成できること

下記のようなコードの差異が理解できる、はず。

A/database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV["RAILS_MAX_THREADS"] %>
  host: <%= ENV["DB_HOST"] %>
  username: <%= ENV["DB_USERNAME"] %>
  password: <%= ENV['DB_PASSWORD'] %>

B/database.yml
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
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

sukebeeeeei
早大理系 | 大学1年のときにプログラミングを始める | スタートアップ複数社で開発経験 | TOEIC 900点超え | 自作Gatsby.jsブログ http://keisukee.com/
http://keisukee.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away