- 公開日
Ruby Gem Configuration Pattern
railsのgemでよくみかける初期設定ファイル、config/initializers/foo.rb。このような初期設定のインターフェースをgem内に作る場合、いったいどうしたら良いでしょうか。
めざす完成形はコレ!
完成系として、下記を想定してみます。# config/initializers/konfig.rb
Konfig.configure do |config|
config.my_value = 'my configuration value'
end
configureメソッドを用意
まずはmoduleとconfigureというクラスメソッドを用意します。module Konfig
class << self
def configure
end
end
end
Configurationクラス
次に実際の設定値が入るConfigurationクラスを用意します。class Configuration
attr_accessor :my_value
def initialize
@my_value = 'default value'
end
end
完成形
次にこれを組み合わせてみましょう。module Konfig
class << self
def configure
yield(configuration)
end
def configuration
@configuration ||= Configuration.new
end
end
class Configuration
attr_accessor :my_value
def initialize
@my_value = 'default value'
end
end
end
これでインスタンス化されたConfigurationクラスが出てきます。
> Konfig.configure {|config| p config}
#<Konfig::Configuration:0x007ff5dfba4a50 @my_value="default value">
Konfig.configure do |config|
config.my_value = "abc"
end
# => "abc"
Konfig.configuration
# => #<Konfig::Configuration:0x007fa9730aace8 @my_value="abc">configureでConfigurationインスタンス作っててブロック内のconfig変数でConfigurationインスタンスに設定注入していくようなイメージですね。