はじめに
apiのエラーハンドリングを実装します。
前提知識としてconcern
やrescue_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
コメント