5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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::ConcernActiveSupport::Concernをmodule内にクラスメソッドとしてmixinしています。
↓ 中身はここにあります。

参考にしたサイト

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?