1
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?

コントローラの共通化(concerns)

Last updated at Posted at 2023-06-21

はじめに

ポートフォリオや簡単なアプリだと共通するコントローラの処理は、 Application .controller.rb などにまとめてしまうのが楽だと思います。しかし、規模が大きくなり、共通する処理全てを Application .controller.rbに記述してしまうと、誰も読みたくなくなるcontrollerが完成です。
今回は controllers/concerns というディレクトリに処理をまとめる機会があったので、自分のメモ用として、書き残したいと思います。

前提

今回は、company, company_userという2つのモデルが存在し、それぞれのコントローラ( companies_controller.rb, company_users_controller.rb)で全く同じ「create」アクションを使用しているという設定で書きます。

companies_controller.rb
class CompaniesController < ApplicationController
 
 def create
   #共通化した処理
 end

end
company_users_controller.rb
class CompanyUsersController < ApplicationController
    
 def create
  #共通化した処理
 end

end

concernsの作成

controllers/配下にconcernsというディレクトリを作成します。(既にある場合は、作成する必要はありません。)
そのconcernsのディレクトリ内に共通化するコントローラのフォルダを作成します。今回は、common_create_actions.rbとします。実際に共通する中身を書いていく際に、注意する点がいくつかあります。それは、①moduleで宣言すること、②extendすることです。

common_create_actions.rb
# ①moduleで宣言する (ファイル名と一致させる)
module CommonCreateActions
  # ②絶対に必要
  extend ActiveSupport::Concern

  def create
    #省略
  end

end

これで完成!...ではない!

もちろん外部で作成したファイルなのだから、そのファイルの処理(module)を使わせてください!と宣言(include)しなければならない。使いたい側のファイルで、

companies_controller.rb
class CompaniesController < ApplicationController
 include CommonCreateAction   #使わせてください!!(include)
end
company_users_controller.rb
class CompanyUsersController < ApplicationController
 include CommonCreateAction   #使わせてください!!(include)
end

まとめ(これで呼び出せていたら完成!)

アクションを丸ごとconcernsにということはあまりないと思いますが、今回はたまたまあったので、まとめました。
本来ならactionの一部をconcernsで処理!のように使うことが多いと思いますが、まだまだ共通化しているところを見抜くのが得意ではないので、しっかり使いこなせるようにしていきたいです!

1
0
1

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
1
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?