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あたりが活躍するんだろう。

参考資料