railsのコントローラーでAPIの必須項目が入力されているかチェックする方法です。
どんなケースで使うのか具体的な使い方を書いていきます。
rails guideには以下の説明がされています。
In addition, parameters can be marked as required and will flow through a predefined raise/rescue flow that will result in a 400 Bad Request being returned if not all required parameters are passed in.
サンプルコード
class UserController < ApplicationController
rescue_from ActionController::ParameterMissing, with: :handle_parameter_missing
def index
@users = User.search(user_search_params)
end
private
def user_search_params
params.require(:name, :email)
params.permit(:name, :email)
end
def handle_parameter_missing(e)
render json: { message: e.original_message }, status: 400
end
end
コードの説明
-
index
アクションではユーザの入力値を使ってユーザ情報の検索を行う。 - ユーザの入力値は
require
メソッドを使用して必須項目の存在確認を行う。 - 必須項目が存在しない場合は例外
ActionController::ParameterMissing
が発生するのでrescue_from
で捕捉する。 -
rescue_from
で例外を捕捉した後handle_parameter_missing
内でエラーメッセージを抽出しレスポンスのjsonを返却する。
コードの詳細な説明
1. actionの定義
ユーザの検索アクションです。User.search
引数にユーザの入力値を検証したパラメーターを指定します。
def index
@users = User.search(user_search_params)
end
2. 入力値の検証
def user_search_params
params.require(:name, :email)
params.permit(:name, :email)
end
require
メソッドを使ってパラメータを検証します。
require
メソッドは引数に指定したkeyが存在しない場合、例外ActionController::ParameterMissing
を発生させます。
3. 例外ActionController::ParameterMissing
の捕捉
rescue_from ActionController::ParameterMissing, with: :handle_parameter_missing
def handle_parameter_missing(e)
render json: { message: e.original_message }, status: 400
end
rescue_from
でActionController::ParameterMissing
を捕捉してエラー処理を行います。
エラー処理ではmessage
keyにoriginal_message
で取り出したエラーメッセージを格納します。
また、status codeに400を指定します。
エラーメッセージの抽出について
original_message
メソッドを使用して簡潔なエラーメッセージのみを取り出す事ができます。
$ e.original_message
=> "param is missing or the value is empty: name"
message
メソッドだとkeyのサジェストが出てしまいます。
e.message
=> "param is missing or the value is empty: name\nDid you mean? target_date\n rate\n controller\n format"
e.full_message
だとスタックとレースが表示されます。
参考
rails guide