AR ホームベーカリー

オイラのアウトプット用ホームベーカリー!

ENV が利用できない(ので ENV を利用できるようにする)

なんのこっちゃい、という感じですが。 だいたいこちらに書いてあるとおりです、ありがてえ。

zenn.dev

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_HOST127.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"}

以下省略

ログに、環境変数として指定した値が出ればオッケーです。

ちなみに

本当はこのように、もうちょっと簡単に記述できます。

qiita.com

して unsafe_load load に分けてるナンデ? というと Psych 4.0.0 で破壊的修正がこのあたりに入ったらしく、という話を聞いており。 このへんかな?

www.hsbt.org

幸いにして僕は、このあたりの問題にまだぶつかってないんですが。 じゃあ Railsdatabase.yml を読み込む部分についてはどうなん? と調べたら、場合分けされていたのでパクった、ということですね。

github.com

      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 なんもわからん。