[Rails-API] HTTPステータスコードを理解する

学習記録

はじめに

apiのエラーハンドリングを実装します。

前提知識としてconcernrescue_fromについての解説もしていきます。

concernとは?

Ruby on Railsのコンポーネントであり、Ruby言語の拡張などを行っているActiveSupportの一部。

railsの共通部分をまとめるような使い方をすることが多く、主にコントローラやモデルで使う処理や、複数の場所で使うスコープを共通化します。

rescue_fromとは?

rescue_fromは例外処理をとりまとめるRailsの機能。

rescue_fromは例外の種類を指定し、そのときに実行する処理を記述しておけば、1つのコントローラファイルの中のすべてのアクションで発生する例外をキャッチしてくれます。 今回の使い方では、withオプションで例外時に実行するメソッドを指定します。


rescue_from キャッチする例外名, with: :メソッド名

private

def メソッド名
  例外発生時に実行する処理
end

注意点として、rescue_fromは下から優先的に実行する性質があります。
このため、複数のエラーを複合する例外クラスは上に記述する必要があります。

エラーハンドリングを作成

module Api::ExceptionHandler
  #モジュールの中でActiveSupport::Concernモジュールをエクステンドする
  extend ActiveSupport::Concern

  # インクルーダーに追加する処理を定義する
  included do
    rescue_from StandardError, with: :render_500
    rescue_from ActiveRecord::RecordNotFound, with: :render_404
  end

  private

  def render_400(exception = nil, messages = nil)
    render_error(400, 'Bad Request', exception&.message, *messages)
  end

  def render_404(exception = nil, messages = nil)
    render_error(404, 'Record Not Found', exception&.message, *messages)
  end

  def render_500(exception = nil, messages = nil)
    render_error(500, 'Internal Server Error', exception&.message, *messages)
  end

  def render_error(code, message, *error_messages)
    response = {
      message: message,
      errors: error_messages.compact
    }

    render json: response, status: code
  end
end

exception : 例外オブジェクトのこと。

exception&.message : ぼっち演算子。レシーバがnilの場合、エラーにならずnilを返す。

作成したエラーハンドリングをインクルードする

ActiveSupport::ConcernをエクステンドしたモジュールをBaseControllerにインクルードしましょう。

module Api
  module V1
    class BaseController < ApplicationController
      include Api::ExceptionHandler
    end
  end
end

参考

【Rails】rescue_fromとは?わかりやすく解説。例外処理の便利な使い方実例(rescueとの違い)
Railsではエラーが発生したときに実行する処理にrescueを使うことが多いです。rescueはRailsではなくRubyの制御構文です。Railsにはrescueとは別に、rescue_fromという便利な例外処理があります。rescu

コメント

タイトルとURLをコピーしました