Settingslogic を使って Rails アプリで独自の設定を記述する

環境

参考

手順

  1. Gemfile に追加して bundle
  2. Settings.rb を記述
  3. application.yml を追加
  4. application.yml に記述
  5. Rails console で確認

1. Gemfile に追加して bundle

省略

2. Settings.rb を記述

app/models/settings.rb に配置。good place と書かれているだけで app/modelsにしか置けない訳ではない。他で利用される前に読み込まれていればいいというだけのようだ。 models に Settings があるというのはどうなのかなーと考えたりもしたが、README にもある通り分かりやすくて良いのではないかと思う。

後述する類似ライブラリで rails_config は Settings というグローバルなオブジェクトをライブラリ側で用意し、figaro は ENV を利用しようとしたのは、方針が大きく異なっていて面白いなと思う。どれがいいというのは判断つかず。。

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

3. application.yml を追加

config/application.yml で作る

4. application.yml に記述

本家の README の通りだが、Rails.env の値を使ってあげると、環境ごとに設定値を変える事ができる。README のように defaults のような形で基本形にアンカーをつけておくとやりやすい。

例えば以下の例だと production 環境でのみ host を変えている。(現実はもっと複雑なのでこう上手くいかない事のが多いのですが。。)

sample_api: &sample_api
    host: 'localhost'
    consumer_key: 'test'
    consumer_secret: 'secret'

defaults: &defaults
    <<: *sample_api

development:
    <<: *defaults

production:
    <<: *defaults
    host: '----'

test:
    <<: *defaults

5. Rails console で確認

% Settings.consumer_key
=> "test"

その他の機能

README ままだが、以下の2つがある。

  • Optional / dynamic settings
  • Suppressing Exceptions Conditionally

Optional / dynamic settings

ハッシュ記法でアクセスした場合には、存在しないキーでも例外とならず nil が返る。
また、その場合に値を設定するとその後は通常アクセスで、動的に設定した値が取得できるようになる。

Suppressing Exceptions Conditionally

存在しないキーに通常アクセスした場合に、例外を握りつぶすかどうかの設定ができる。握りつぶした場合はハッシュ記法でアクセスした場合と同様に nil が返る。

他の類似ライブラリ

の2つがパッと見つかった。figaro だけついでに調査。

figaro

https://github.com/laserlemon/figaro

Settingslogic の Settings のような専用のオブジェクトを用いるのではなく、ENVを使おうという方針らしい。

yaml ファイルでの管理方法や Rails.env で切り替えられる点も同じ。呼び出し時に ENV 経由で呼び出すという点以外は同じように利用できる。

単純な key/value な設定だけならこれで十分だが、複雑な設定ファイルになるようなら figaro は選べないかなーという印象。

ちなみに

figaro は現状 Rails 4.1.0.beta1 では動作しない。ただ、Githubリポジトリの方では問題は修正されているようなので、そちらを直接使うようにすればうまくいく。