なんのこっちゃい、という感じですが。 だいたいこちらに書いてあるとおりです、ありがてえ。
Rails の環境変数呼び出し
rails new ./example
とかして sqlite で初期化すると、こんな感じの config/database.yml
が生成されると思います。
default: &default adapter: sqlite3 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> timeout: 5000 以下省略
<%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
の部分は、環境変数 RAILS_MAX_THREADS
を参照し、存在しなければ 5
を利用する。
という動作です。
やったー簡単に環境変数を呼べる!
redis で呼ぶ
gem 'redis'
を指定した環境にて、上記と同じ様に config/redis.yml
から、 ENV
で環境変数呼べ……ない!
default: &default db: host: <%= ENV['REDIS_HOST'] %>
REDIS_HOST
に 127.0.0.1
などなんかしらの値が入っていても、実際にコードが読まれると <%= ENV['REDIS_HOST'] %>
として解釈され、値が展開されない。
どうする
yaml を理解できないならできるようにしてやればよいのです。
というわけで、実際に <%= ENV['REDIS_HOST'] %>
を呼び出している Ruby のファイル先頭に、記述を追加します。
今回は sidekiq+redis という環境だったので、呼び出しているのは config/initializers/sidekiq.rb
でした。
こちらの先頭に追加してやります。
yaml = ERB.new(Pathname.new('config/redis.yml').read).result redis_config = if YAML.respond_to?(:unsafe_load) YAML.unsafe_load(yaml)[Rails.env] || {} else YAML.load(yaml)[Rails.env] || {} end # 適当にテスト print ENV.fetch ('REDIS_HOST') {"aaaaaaaaaaaaaaaaaaaaaaaaadeneeeeeeeaaaaaaaaaaaaaaaaaaa"} 以下省略
ログに、環境変数として指定した値が出ればオッケーです。
ちなみに
本当はこのように、もうちょっと簡単に記述できます。
して unsafe_load
load
に分けてるナンデ? というと Psych 4.0.0 で破壊的修正がこのあたりに入ったらしく、という話を聞いており。
このへんかな?
幸いにして僕は、このあたりの問題にまだぶつかってないんですが。
じゃあ Rails の database.yml
を読み込む部分についてはどうなん? と調べたら、場合分けされていたのでパクった、ということですね。
def load_database_yaml # :nodoc: if path = paths["config/database"].existent.first require "rails/application/dummy_erb_compiler" yaml = DummyERB.new(Pathname.new(path).read).result if YAML.respond_to?(:unsafe_load) YAML.unsafe_load(yaml) || {} else YAML.load(yaml) || {} end else {} end end
Rails のコード、全体を一斉に読もうとするとなにがなんだか、という感じですが。 こうやって問題にぶちあたって、部分部分だけ拾えると「へえっ!」ってなるので面白い。
というのを 10 年以上前に当時居た会社の CEO に言われてたんですが、めぐりめぐってようやく言葉の意味がわかってきましたね。 Rails なんもわからん。