Rails concernとは
Railsでアプリケーションを作ると、controllers/concerns
, models/concerns
が自動的に生成されますがこのディレクトリを使ったことはありますか? 僕はないです。
調べてみたところ、主に
共通ロジックを持つときにconcernに切り出す
そのmodelやcontrollerとは異なるロジックである場合に切り出す
の2つの使い方があるのかなと思いました。
例として、メールの送信ロジックなどをあげることができます。
特定の条件(投稿数が100に達する、フォロワーが100人に達するなど)を満たした時に、メールを送信するというロジックは、複数のモデルに適用することができますし、モデルロジックとは少し異なるロジックであると考えることができます。
このような時にmoduleとしてconcernに切り出します。
切り出されたmoduleは必要とするmodelでincludeすることによって使うことができます。
使い方
concernの使い方としては2つあります。
-
concernsディレクトリ
に切り出す -
concerning ~~~ do
で切り出さずに使う
2つの使い方の違いは下記の記事がとてもわかりやすいです。
-
concernsディレクトリに切り出す
=> 使い回しをすることができる -
切り出さずにクラス内で
concerning ~~~ do
を使って定義する
=> 使い回しをすることはできないが、異なるロジックであることを強調できる
ActiveSupport::Concern
extend ActiveSupport::Concern
は魔法です。
extend ActiveSupport::Concern
をmodule内で使うことによって、簡単に書くことができるようになるので嬉しいです。
使わない場合
module M
def self.included(base)
base.extend ClassMethods
base.class_eval do
scope :disabled, -> { where(disabled: true) }
end
end
module ClassMethods
...
end
end
使う場合
module M
extend ActiveSupport::Concern
included do
scope :disabled, -> { where(disabled: true) }
end
class_methods do
...
end
end
extend ActiveSupport::Concern
はActiveSupport::Concern
をmodule内にクラスメソッドとしてmixinしています。
↓ 中身はここにあります。
参考にしたサイト