railsのcontrollerにおけるconcernsディレクトリについて

rails

railsのcontrollersディレクトリ配下にある、concernsディレクトリについて解説する記事を書きます。

本記事ではconcernsの使い方について(主にextend ActiveSupport::Concernの使い方を)、例を交えながら解説していきます!

concernsが使いこなせるようになると、見やすいコードで開発ができるようになるため、ぜひこの記事で身につけていただけたらなと思います。

concernの使い方について

railsで使用されるconcernはコードの使い回しなど再利用したい場合に使用します。具体的な使い方は以下のようになります。

module X
  extend ActiveSupport::Concern
  def hoge
    put("hoge")
  end
end

これは、concernsディレクトリ配下のファイルを読み込むことができ、ファイルのメソッドをクラスメソッドとして使用することができます。

concernsディレクトリ配下に複数のファイルを保管するとき、できるだけメソッド名を一意にした方が、エラーを防ぎます(複数のファイルに同じ名前の処理(例えばhoge)を書いていたら、concernsをextendした時に、どこのファイルのhoge関数を読んでる??ってなってしまいエラーの原因となりうるため)。

concernsの配下にmoduleファイルを作成します。他のファイルにincludeすることでここに記述した内容を反映させることができます。

class HogesController < ApplicationController
  include X

  def index
    hoge  //hogeが出力される
  end
end

include Xでmodule Xを読み込むことができます。それにより、module X内のメソッドが使用することができるようになります。

ここで、ルールとして、includeしたいファイル名とmodule名は合わせる必要がある(hoge_testなどのファイル名にしたい場合は、Module名はキャメルケースのHogeTestにする必要がある)。

extend ActiveSupport::Concernを使用することで、何度も使用する処理はincludeで呼び出すことができ、コードをすっきり書くことができます!

modelとの棲み分けについて

コードを使い回しする方法として、concern以外にもmodelファイルに書くという方法があります。

modelファイルに書くこととの違いは、同じ名前のcontrollerから参照できるかどうかです。

例えば、modelを跨いだ処理を書く場合はconcerns、そのモデルでしか処理を使わない場合はmodelに書くと言ったら要領になります。

application_controller.rbとの棲み分けについて

application_controller.rbに処理を書くとどのcontrollerからでも呼び出すことが可能です。

class HogesController < ApplicationController # ApplicationControllerを継承している
  ...
end

controllerを見てみると、ApplicationControllerを継承していることがわかります。

ただ、基本的にはApplicationControllerにはログイン済みかどうかを判別する処理(deviseとか)や、権限関係を記載するなど、最低限の処理を記載しています。

ここに記載すればどこからでもメソッドを呼び出せるので、includeする手間は省きますが、下記の懸念が発生します。

  • ApplicationControllerで管理する処理が多くなり、逆に見づらくなる。
  • 無駄に処理を読み込むことになり、処理速度が低下する

よって、必要に応じてmodule、model、ApplicationControllerを使い分ける必要があります。

concernについてのまとめ

以上、concernの役割について説明しました!

その他controllerで使用しているメソッドなどをこちらの記事にまとめているので、より深く知りたい方は参考にしてみてください。

コメント

タイトルとURLをコピーしました