nownab.log

nownabe's daily posts

EasySettingsをSettingslogicの替りにいかがでしょうか

Posted on Mar 7, 2015

今までRailsとかその他諸々のアプリケーションで、定数の管理にSettingslogicを使ってました。 色々不満がありつつ使ってたんですが、この度EasySettingsというGemを新しく作りました。

https://github.com/nownabe/easy_settings

元々はアプリ側でデフォルト値を設定したくてSettingslogicDefaultみたいなGemを作ったんですが、色々と限界を感じたのでもう新しいの作ってしまおうと。

初期化いらず

# EasySettings
# いらない

# Settingslogic
class Settings < Settingslogic
   source Rails.root.join("config/settings.yml").to_s
end

メソッド形式での動的代入ができる

# EasySettings
> EasySettings.foo ||= "bar"
=> "bar"

# Settingslogic
> Settings.foo ||= "bar"
Settingslogic::MissingSetting: Missing setting 'foo' in settings1.yml

ネストされたHashで同じキーが使える

というか使えないSettingslogicにびっくり。

# EasySettings
> EasySettings["foo"] = {foo: "bar"}
=> {:foo=>"bar"}
> EasySettings.foo.foo
=> "bar"

# Settingslogic
> Settings["foo"] = {foo: "bar"}
=> {:foo=>"bar"}
> Settings.foo.foo
Settingslogic::MissingSetting: Missing setting 'foo' in settings.yml

デフォルト値が設定できる

元々これをやりたかったんですが、あんまりいらない気もする。 デフォルト値設定を簡潔に書きたくてこういう仕様にしました。

> EasySettings.foo
=> nil
> EasySettings.has_key?(:foo)
=> false
> EasySettings.foo("bar")
=> "bar"
> EasySettings.foo
=> "bar"
> EasySettings.foo("baz")
=> "bar"

こんなこともできます。

> EasySettings.foo({}).bar("baz")
=> "baz"
> EasySettings.to_h
=> {"foo"=>{"bar"=>"baz"}}

Settingslogicだとできない。

> (Settings[:foo] ||= {})[:bar] ||= "baz"
=> "baz"
> Settings[:foo][:bar]
=> nil

詳しい使い方はGithubのREADMEに書いてます。

是非、使ってみてください。