LoginSignup
70
43

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-06-29

執筆経緯

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

70
43
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
70
43