controller における concern の書き方 ; Rails

先ず concern とは?

  • 機能を集約する手段
    • (今回は ApplicationController によく書かれる session_required を
      concerns ディレクトリ下のモジュールに集約する)

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 には「何を書くべきか」と調べたときの書き残し

  • 上記のように「何でも集約」をしていいのかな、と思ったので

答えは出てないです(勉強中)

Application Controller

  • 画面制御と処理フローの中心となる
    • Martin Fowler が P of EAA で言及しているらしい
    • 直感、ちょっとやそっとで「どうしたほうがいいか」ってのは分からないかも

Ruby on Rails coding standard

  • 簡潔であること。グローバルフィルタ、ロケール設定やアクセスコントロールなどのリクエストに対してのみ使うこと
  • ApplicationController は各々のリクエストに対して呼ばれるので、最適化し「ウルトラファースト(ultra-fast)」でなければいけないことを常に意識せよ

what-should-an-application-controller-do

  • 未読
    • 勉強します