よくあるGemName.configureの実現方法をまとめた

ruby 2.4.0がついにでましたね。

FixnumとBignumがIntegerに統合されるとかが移行時に影響でそうな気がしますね。

さて今回はconfig/initializers/gem_name.rb内で

GemName.configure do |config|
  confing.foo = 'bar'
end

とか設定して

p GemName.config.foo
#=> 'bar'

みたいに使うやつの実現方法を調べたのでまとめました。

PORO(plain old ruby object)で実現する方法とActiveSupport::Configurable使う方法の2つがあるっぽい。

ちなみにkaminariActiveSupport::Configurable使ってた。

POROの場合

module GemName
  self << class
    def configure
      yield config
    end

    def config
      @config ||= Configure.new
    end
  end

  class Configure
    attr_accessor :foo

    def initialize
      @foo = 'bar' # default
    end
  end
end

仕組みとしてはGemName#configureでattributeをwriteして、GemName#configでattributeをreadしてる。シンプル。

ActiveSupportの場合

ActiveSupport::Configurableなるものがrails3からあるみたい。

require 'active_support/configurable'
module GemName
  include ActiveSupport::Configurable
  config_accessor :foo do
    'bar' # default
  end
end

これだけ。 また、read onlyにしたい場合はinstance_writer: falseを、write onlyにしたい場合はinstance_reader: falseをconfig_accessorのオプションとして渡してあげればOK

特にこだわりがなければActiveSupport使っちゃえば楽です。

所感

  • railsのinitializer内に設定ファイルぶち込むrakeタスクも併せて作ったほうがよいかな〜

参考