Active Support の concern を使ってみる
Ruby
Published: 2019-06-08

やったこと

Active Support の concern を使ってみます。

確認環境

$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]

$ rails --version
Rails 5.2.3

調査

concern を使う主な理由

mix-in で同じことをやると記述が複雑になりますが、concern を使えば簡潔に書くことができます。

また、複雑な依存関係を考慮しなくて良くなります。

確認 (concern なし)

test.rb

module Hoge2
  def self.included(base)
    base.class_eval do
      def self.method_injected_by_hoge2
        'method_injected_by_hoge2'
      end
    end
  end
end

module Hoge1
  def self.included(base)
    base.method_injected_by_hoge2
  end
end


class Sample
  include Hoge2
  include Hoge1
end

p Sample.method_injected_by_hoge2

ここで、include Hoge2 がないと下記のエラーで落ちます。

Traceback (most recent call last):
	3: from ruby-mix-in.rb:18:in `<main>'
	2: from ruby-mix-in.rb:19:in `<class:Sample>'
	1: from ruby-mix-in.rb:19:in `include'
test.rb:13:in `included': undefined method `method_injected_by_hoge2' for Sample:Class (NoMethodError)

確認 (concern あり)

test.rb

require 'active_support/concern'

module Hoge2
  extend ActiveSupport::Concern

  included do
    def self.method_injected_by_hoge2
      'method_injected_by_hoge2'
    end
  end
end

module Hoge1
  extend ActiveSupport::Concern

  include Hoge2

  included do
    self.method_injected_by_hoge2
  end
end


class Sample
  include Hoge1
end

p Sample.method_injected_by_hoge2

Sample クラスは Hoge1 だけ include すれば良くなりました。

参考