BackGround
Postmanを使ってRailsのアクションを設計どうりに処理してくれるかテストしていました。
問題になったのはこのuser_controller
のshowアクション
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
render json: { status: 'success', data: @user }
rescue ActiveRecord::RecordNotFound
render json: { status: 'error!', data: @user.errors }
end
private
def user_params params.require(:user).permit(:user_name,:email,:password,:password_confirmation)
end
end
存在したら、ユーザ情報を返し、「存在しなければそんなのいねえよ!」ってことでエラーを吐くはず。
Let's Do It!!
ってことでPostman上で存在しないユーザ(ID:20)に対し、アクションを要求する。
error!って返って来るはず♪
ん?404???error!じゃなくて??
404までは期待どうり。だけどそのあとの処理が拾われていない??
rescueとは・・・
Research Solution
大人しく、チャレキャラのメンターさんに質問しました。
その中でも、日頃お世話になっているアルバイト先のBig Bossに助けてもらいました💦
Solution
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
render json: { status: 'success', data: @user }
rescue ActiveRecord::RecordNotFound
render json: { status: 'error!', data: '' }, status: :not_found
end
private
def user_params params.require(:user).permit(:user_name,:email,:password,:password_confirmation)
end
end
render json: { status: 'error!', data: @user.errors }
の部分を
render json: { status: 'error!', data: '' }, status: :not_found
に変更
Why??
理由としては、userがnillなのに、errorメソッドを呼んで、errorを返してしまうってこと*らしい
確かにnill
ってオブジェクトでもないわけだからそれにメソッド呼んでも処理ができるはずはない。
だもんで、戻り値にエラーを吐かないようにしてかつ、statusを返すようにしたわけですね!
+ α
そもそも、rescue
は多用しないほうがいいという知見をいただきました。
自分も使い慣れてないし、当分はif-else分岐で行こうかと思い、書き直してみよう!
class UsersController < ApplicationController
def show
@user = User.find_by(id:"")
render json: { status: 'success', data: @user }
if ActiveRecord::RecordNotFound
render json: { status: 'error!', data: 'user_params' }, status: :not_found
end
private
def user_params params.require(:user).permit(:user_name,:email,:password,:password_confirmation)
end
end
こんな感じ?
コメントで教えてもらうと助かります
Summary
チャレキャラのメンターさん達みたいになりたい