Ruby on Rails のエラーCouldn't find with id=が表示された際の3つの確認点

Ruby on Railsのアプリケーションを1から作成した際に Couldn't find Model名 with id=というエラーが発生しましたので 共有のために対応方法について記載します。
Couldn't find with id= について
このエラーは例えばeditページなどでidを引き渡して情報を取得しようとしたがidがnillになっている為、このエラーが発生しました。
今回はindexページからeditアクションへリンクを設定して解説します。
Model:Blog
Controller: BlogsController
以下はrootの一部
Prefix Verb URI Pattern Controller#Action blogs GET /blogs(.:format) blogs#index edit_blog GET /blogs/:id/edit(.:format) blogs#edit
確認点1:pathの設定へidが設定されているか
例えば下記ページの下から4つ目のeditページへのpathに IDが引数で設定されていなければエラーになります。
index ページ <h1>全ての投稿一覧</h1> <table> <tr> <th>タイトル</th> </tr> <% @blogs.each do |blog| %> <tr> <td><%= blog.title %></td> <td><%=link_to "編集する",edit_blog_path(blog.id) %></td> </tr> <% end %> </table>
なお上記では@blogsのインスタンス変数を繰り返し処理を呼び出しているので、blog.id引き渡さないとエラーになります。
上記と同様にeachなどの繰り返し処理で、Couldn't find with id= が表示される際は 呼び出す引数にもご注意ください
またルートパスの設定が間違っている場合もあります
確認点2:controllerのeditアクションで値の呼び出し設定ができているか確認
editアクションで、indexページで引き渡した値を検索するコードを記載しなければエラーになります。
class BlogsController < ApplicationController def index @blogs = Blog.all end def edit @blog = Blog.find(params[:id]) #IDを検索する処理を記載 end end
上記例ではBlogsControllerのeditアクションの(params[:id]) で、viewのeditblogpathでgetした(blog.id)を引き渡しています
Couldn't find with id=エラーが発生する際は、対象コントローラーのアクションでidを引き渡す処理が記載されているかご確認ください。
確認点3:rootの設定が複数形のresourcesで設定されているか
rootは単数形のresourceとresourcesの2つの定義が存在します。
詳細な解説はここでは省きますが、resourcesでpathを生成しないとURLにIDが引き渡せなくなり、個別の値を検索できないためエラーとなります。
Rails.application.routes.draw do root 'blogs#index' resources :blogs #resourcesで指定 end
以上になります。
エラーを切り分ける場合はByebugを利用する事をお勧めします。
Ruby on Railsのデバッグツール byebugの紹介
その他関連記事
未経験からエンジニアになった人間が解説|独学プログラミングで挫折しないよう心がける事
独学プログラミングの勉強手順|未経験からエンジニアになった人間が解説
未経験からエンジニアになった人間が考える、今からエンジニアに就職する方法
Ruby on Rails Python等各プログラミング言語のエラーと対応方法一覧
未経験からフリーランスエンジニアは厳しい|現役エンジニアが解説
税理士が執筆|フリーランスから法人成りする基準と法人化のメリット・デメリット
Template is missingの対応方法|Ruby on Railsでよく発生するエラー1
NameError | Ruby on Railsでよく発生するエラー2
Ruby on RailsでAction名やController名を取得する