ActiveSupport::Concern

以前書いたモジュールの特異メソッドをincludeして使うと同じことが、ActiveSupport::Concernを使うことでもうちょっと綺麗に書ける。

module A
  extend ActiveSupport::Concern

  included do
    # Aがincludeされた際に、includeしたクラスのコンテキストで実行される
  end

  module InstanceMethods
    def instance_method_of_a
      p "instance_method_of_a"
    end
  end

  module ClassMethods
    def class_method_of_a
      p "class_method_of_a"
    end
  end
end
class B
  include A
end

こんなモジュールをとあるクラスBでincludeすることで、

される。

モジュールをincludeすることによって追加されるクラスメソッド、インスタンスメソッドが明確になるので嬉しい。

ただそれだけだとちょっとメリットが弱い気がしなくもない。きっとincludedや、今回触れなかったextendedあたりが活躍するんだろう。

参考資料