Rails RoutingErrorを捕捉する


RoutingErrorを捕捉する

この記事は以下の記事の続きとなりますRailsでエラー画面を作ろう

クラスメソッドrescue_fromはアクションで発生した例外を捕捉するためのものなので、ルーティングの段階で発生するための処理は捕捉できません

ということでconfig/initializersディレクトリのファイルを作成する必要があります。

request.path_infoの値によって呼び出すアクションを振り分けています。

404 => not_foundアクション
422 => unprocessable_entity
それ以外 => internal_server_error

その後ErrorsControllerにactionを引数として渡して呼び出しています。

exceptions_app.rb
Rails.application.configure do
  config.exceptions_app = ->(env) do
    request = ActionDispatch::Request.new(env)

    action =
      case request.path_info
      when "/404"; :not_found
      when "/422"; :unprocessable_entity
      else; :internal_server_error
      end
    ErrorsController.action(action).call(env)
  end
end

コントローラーは以下のようになります。
それぞれのアクションに対してrenderで表示するviewを指定しています。

errors_controller.rb
class ErrorsController < ApplicationController
  def not_found
    render status: 404
  end

  def unprocessable_entity
    render status: 422
  end

  def internal_server_error
    render status: 500
  end
end

ということでrescue_fromで捕捉できないroutingエラーも
以上のようにしてエラー処理を行い、画面を表示することができました。