やったこと
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 すれば良くなりました。