Settingslogic を使って Rails アプリで独自の設定を記述する
環境
参考
手順
- Gemfile に追加して bundle
- Settings.rb を記述
- application.yml を追加
- application.yml に記述
- 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 が返る。
他の類似ライブラリ
- figaro
- rails_config
の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 のリポジトリの方では問題は修正されているようなので、そちらを直接使うようにすればうまくいく。