例外処理

Railsではいくつかの特定の例外クラスに限り、例外クラスに対応したステータスコードを返す仕組みになっています。コントローラの基底クラスで定義されているので、変更したい場合を除き明示的に記述する必要はないです。

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を使うとコードの見通しが良くなります。