3
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

railsのコントローラーでAPIの必須項目の入力チェックする

Last updated at Posted at 2021-07-25

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

コードの説明

  1. indexアクションではユーザの入力値を使ってユーザ情報の検索を行う。
  2. ユーザの入力値はrequireメソッドを使用して必須項目の存在確認を行う。
  3. 必須項目が存在しない場合は例外ActionController::ParameterMissingが発生するのでrescue_fromで捕捉する。
  4. 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_fromActionController::ParameterMissingを捕捉してエラー処理を行います。

エラー処理ではmessagekeyに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

3
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?