Rails 設定定数を定義するのに便利な gem

たとえば API キーとか、基本的には固定だけど調整で時々変えたい定数みたいなものを定義したいことはよくあると思いますが、それに便利な gem のメモ。

特に目新しいものでもなく、割と定番そうなものですが。

Settingslogic

gem をインストールしたら、以下のようにクラスを定義します。

場所は読み込まれさえすればどこでもよいですが、config/initializes/ がよいかもしれません。

class Settings < Settingslogic
  source "#{Rails.root}/config/application.yml"
  namespace Rails.env
end

source に渡した yaml を読み込み、設定値として扱ってくれます。上記は README の抜粋ですが、必要があれば任意のパスに書き換えても良いでしょう。

yaml はこんな感じで記述します。

# config/application.yml
defaults: &defaults
  guitar:
    maker: Fender
  effector: SD-1
  gain: <%= 1 + 2 %>

development:
  <<: *defaults

test:
  <<: *defaults

production:
  <<: *defaults
  effector: DS-1

上記のように記述すると定義したクラスで以下のようにアクセスできます。

Settings.guitar.maker # => "Fender"
Settings.gain # => 3

階層はプロパティのようにアクセスできます。また、計算式も結果を返してくれます。

下の三つの定義は見た目のとおり、環境ごとに上書きされる設定です。

この場合、production 環境では effector が DS-1 となり、ほかの項目は default で定義したものを引き継ぎます。

RailsConfig

gem をインストールしたら、インストールコマンドを実行します。

rails g rails_config:install

いくつかのファイルが生成されます。それぞれの役割を示します。

config/initializers/rails_config.rb

yaml をパースした定義にアクセスするクラスが定義されています。

デフォルトは Settings になっています。

config/settings.yml

全ての環境で使用される設定項目です。

以下その名の通り、環境ごとに読み込まれ、上書きする値を定義できます。

  • config/settings/development.yml
  • config/settings/production.yml
  • config/settings/test.yml

 config/settings.local.yml

ユニークだと思った機能です。このファイルがあると、ローカル環境でのみ使いたい値として定義できます。

インストールコマンドで生成されますが .gitignore に追記されるのでコミット対象外になっています。

値の定義の仕方と、呼び出し方は Settingslogic と(default などの環境の定義がないのでそれを除いて)同様です。

環境ごとの定義は、RailsConfig の場合はファイルごとに行います。

呼び出し方は同じなので、使い方の観点では差はありません。

機能的には RailsConfig の方がジェネレータもあり、環境ごと設定は分割されたファイルに定義ができる、ローカル専用設定というユニークな機能もあって高性能ですが、Settingslogic も導入がシンプルで、それでいて環境ごとの設定値もきちんと持てるので、あなどれません。

どちらが良いか、ということではなく、開発の規模や設定ファイルの開発のしやすさを視野にいれ、選択するのがよさそうです。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする