はじめに
ポートフォリオや簡単なアプリだと共通するコントローラの処理は、 Application .controller.rb
などにまとめてしまうのが楽だと思います。しかし、規模が大きくなり、共通する処理全てを Application .controller.rb
に記述してしまうと、誰も読みたくなくなるcontrollerが完成です。
今回は controllers/concerns
というディレクトリに処理をまとめる機会があったので、自分のメモ用として、書き残したいと思います。
前提
今回は、company, company_userという2つのモデルが存在し、それぞれのコントローラ( companies_controller.rb
, company_users_controller.rb
)で全く同じ「create」アクションを使用しているという設定で書きます。
class CompaniesController < ApplicationController
def create
#共通化した処理
end
end
class CompanyUsersController < ApplicationController
def create
#共通化した処理
end
end
concernsの作成
controllers/
配下にconcerns
というディレクトリを作成します。(既にある場合は、作成する必要はありません。)
そのconcernsのディレクトリ内に共通化するコントローラのフォルダを作成します。今回は、common_create_actions.rb
とします。実際に共通する中身を書いていく際に、注意する点がいくつかあります。それは、①moduleで宣言すること、②extendすることです。
# ①moduleで宣言する (ファイル名と一致させる)
module CommonCreateActions
# ②絶対に必要
extend ActiveSupport::Concern
def create
#省略
end
end
これで完成!...ではない!
もちろん外部で作成したファイルなのだから、そのファイルの処理(module)を使わせてください!と宣言(include)しなければならない。使いたい側のファイルで、
class CompaniesController < ApplicationController
include CommonCreateAction #使わせてください!!(include)
end
class CompanyUsersController < ApplicationController
include CommonCreateAction #使わせてください!!(include)
end
まとめ(これで呼び出せていたら完成!)
アクションを丸ごとconcernsにということはあまりないと思いますが、今回はたまたまあったので、まとめました。
本来ならactionの一部をconcernsで処理!のように使うことが多いと思いますが、まだまだ共通化しているところを見抜くのが得意ではないので、しっかり使いこなせるようにしていきたいです!