- 公開日
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
インスタンスに設定注入していくようなイメージですね。