45
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

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

執筆経緯

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

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
45
Help us understand the problem. What are the problem?