Railsではいくつかの特定の例外クラスに限り、例外クラスに対応したステータスコードを返す仕組みになっています。コントローラの基底クラスで定義されているので、変更したい場合を除き明示的に記述する必要はないです。
ActionController::BadRequest
など)
ActiveRecord::RecordNotFound
など)
ActionControoler::MethodNotAllowed
など)
ActiveRecord::RecordInvalid
など)
rescue_from
特定の例外が発生したときに、特定のレスポンスを返したい時に使うのがrescue_from
です。
rescue_from
による例外クラスの取り扱いはApplicationControllerで定義してアプリケーション全体の振る舞いとして定義します。
rescue_fromで例外クラスを特定して、withオプションで例外発生時に呼ばれるアクションを指定します。ログインに失敗した時に投げられる例外を想定してコードを書いていきます。
class ApplicationController < ActionController::Base
rescue_from LoginFailed, with: :login_failed
def login_failed
render template: 'shared/login_failed', status: 401
end
end
そしてログインが失敗するかもしれない処理に下記のように追加します。
class LoginController < ApplicationController
def create
@user = User.where(name: params[:name], password: params[:password]).find
# login_failedの処理を行う
raise LoginFailed unless @user
end
end
複数のコントローラに跨った例外処理がある時はrescue_from
を使うとコードの見通しが良くなります。