🚀

findでエラーを回避

2024/04/28に公開

原因: find メソッド実行時に指定した id のレコードが見つからない

AcitveRecord::RecordNotFound は

モデルの find メソッドを実行したときに発生するエラー

です。 ほとんどの場合、指定した id を持つレコードがテーブルに存在しないのが原因

@group = Group.find_by(id: params[:id])

で排除したものは表示できないように規制をかけれるが、

@group = Group.find(params[:id])

も記載する場合、まとめて記載が可能

対処法の例

before_action :set_group,only:[:index,:show,:create,:edit,:update]
割愛
private

def set_group
@group = Group.find(params[:id])
rescue ActiveRecord::RecordNotFound
redirect_to root_path
end

@group = Group.find(params[:id])と、find_by(id: params[:id])がコントローラーで重複している場合、上記の記載でコントローラーをリファクタリングすると、同じ挙動を示す。
rescue ActiveRecord::RecordNotFoundが必要。
redirect_toの後は飛ばしたいパスへ適宜変更

補足
before_action :[set_group],def [set_group]
の[ ]で記載している部分はまとめたものに適宜変更。(自分はグループで変数を定義しているため、
set_groupになっているだけです。

ちなみに、

def set_group
@group = Group.find_by(id: params[:group_id])
redirect_to root_path && return if @group.nil?
end
def set_group
@group = Group.find(params[:group_id])
rescue ActiveRecord::RecordNotFound
redirect_to root_path
end

上記2つは同じ挙動を示す。

rescueとは、エラーの場合の処理を書いてあげること。

resoureについては下の記事を参照
https://qiita.com/fgem28/items/2de15a6a0873b6ec01b2

Discussion