Railsのコントローラクラスのrescue_fromメソッドは、例外が発生した場合に実行するメソッドを指定できます。
コントローラーで独自のエラページをエラー内容によって切り替えたり、
APIでエラーが発生した場合に処理を共通化する場合などrescue_fromメソッドを使うとスッキリします。
ということで、APIのエラー処理の共通化を考えてみます。
各APIコントローラーのスーパークラス
各APIコントローラのスーパークラスを作成し、サブクラスで発生した例外は全てここでハンドリングします。
Api::TuleApiErrorが発生した場合、Api::ApiControllerのtule_api_errorメソッドが実行されます。
下記の例ではトークンが不正な場合は、HTTPステータスを401 Unauthorized、それ以外の場合は200 OKを返しています。
HTTPステータスは、例外の内容によって適切な値を設定します。
class Api::ApiController < ActionController::API
include ActionController::HttpAuthentication::Token::ControllerMethods
rescue_from Api::TuleApiError, with: :tule_api_error
protected
# トークン認証
def authenticate
・
・
・
end
private
# エラー時のレスポンスを返す
def tule_api_error(e)
header = {result: e.code, message: e.message}
response = {header: header}
status = :ok
status = :unauthorized if e.code == Api::Result::HTTP_TOKEN_ACCESS_DENIED
render json: response, status: status
end
end
上記のコードでApi::Resultはエラーコードを定義しているクラスです。