controller における concern の書き方 ; Rails
先ず concern とは?
- 機能を集約する手段
- (今回は ApplicationController によく書かれる session_required を
concerns ディレクトリ下のモジュールに集約する)
- (今回は ApplicationController によく書かれる session_required を
controller の「一機能」を concerns のモジュールとして集約する
app/controllers/concerns/session_action.rb
- モジュール controllers/concerns/SessionAction にて
- session_required「session に :id が無ければ logins_path に redirect させる」を定義する
1 module SessionAction 2 extend ActiveSupport::Concern 3 4 def session_required 5 unless session[:id] 6 redirect_to logins_path, alert: 'You should login' 7 end 8 end 9 end
app/controllers/welcome_controllers.rb
- controller/concerns/SessionAction モジュールを include し
- session_required を before_action として実行する
1 class WelcomeController < ApplicationController 2 include SeessionAction 3 before_action :session_required 4 5 def index 6 end 7 end
app/controllers/application_controller.rb
- def session_required を書かれたであろう application_controller.rb はほぼ空
1 class ApplicationController < ActionController::Base 2 protect_from_forgery with: :exception 3 end
蛇足: ApplicationController には「何を書くべきか」と調べたときの書き残し
- 上記のように「何でも集約」をしていいのかな、と思ったので
答えは出てないです(勉強中)
- 画面制御と処理フローの中心となる
- Martin Fowler が P of EAA で言及しているらしい
- 直感、ちょっとやそっとで「どうしたほうがいいか」ってのは分からないかも
- 簡潔であること。グローバルフィルタ、ロケール設定やアクセスコントロールなどのリクエストに対してのみ使うこと
- ApplicationController は各々のリクエストに対して呼ばれるので、最適化し「ウルトラファースト(ultra-fast)」でなければいけないことを常に意識せよ
what-should-an-application-controller-do
- 未読
- 勉強します