【Rails エラー】RecordNotFoundとredirect_toメソッドについて
先日オリジナルアプリの開発を行っていたところ以下のようなエラーが発生しました。
なので、今回はこのエラーの解決方法と深くかかわっていたredirect_toメソッドについて以下の順で学んでいきます。
・エラーコードから原因を読み解く
・redirect_toメソッドとは
・エラーコードから原因を読み解く
今回のエラーはユーザー登録を行うためにUserモデルを作成し、CRUD機能の実装を行い登録したユーザーを削除したときに発生しました。
エラーコードの内容を確認すると
①エラーが発生しているのはUserコントローラーのshowアクション内であること。
②エラーの原因は"id"=13(今回削除テストを行ったユーザーのid)を持ったユーザーが見つからないため詳細を表示することができないというものであること。
ということがわかりました。
つまり、今回の原因はユーザーを削除する機能ではなく削除した後の指示に問題があることがわかりました。
さらに詳しく考えると
showアクションでエラーが発生してしまっているため削除後にユーザー一覧に返したいはずが詳細ページに移動するように指示してしまっていることが原因だと考えられます。
このようにエラーコードを読み解くことで原因の特定が容易になるためエラーが出たときはしっかりと向き合うことが大切になることを実感しました。
それでは該当箇所であると思われるUserコントローラーのdestroyアクションを見ていきましょう。
Userコントローラーのshowアクションには以下のコードが書かれていました。
def destroy @user = User.find(params[:id]) @user.destroy redirect_to admin_user_path end
今回のエラーの原因となっているのはredirect_toの部分です。この部分を
redirect_to admin_users_path
に変更することで削除後に正しくユーザー一覧ページに飛ぶことができ、エラーの問題を解決することができました。
次にエラーの原因となったrenderメソッドについて学んで同じエラーを起こさないようにしていきましょう。
・redirect_toメソッドとは
redirect_toメソッドは指定されたURLに遷移を行ってくれるメソッドです。よって書き方は以下のようになります
redirect_to "リダイレクト先"
URL以外にも様々な方法でリダイレクト先を指定することができます。いくつか紹介していきます。
redirect_to Prefix名 # pathによって遷移先を指定 <br> redirect_to action: :アクション名 # 同一コントローラーのアクションを指定 <br> redirect_to controller: :コントローラー名, action: :アクション名 # アクションだけでなくコントローラーも指定 <br> redirect_to controller: :users, action: :show, id: 1 # usersコントローラーのshowアクションにid=1を渡す
今回のエラーに関してはpathを使用して遷移先を指定しており、それが誤ってshowアクションになってしまっていました。
ちなみに、pathの確認はrails routesを行うことで確認できるので皆さんもredirect_toメソッドに関係するエラーが出たときは一度確認してみてください。
参考サイト