🚀
findでエラーを回避
原因: 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については下の記事を参照
Discussion