ActiveRecord::RecordNotFoundエラー

アプリの開発中はエラーの宝庫ですね。
今回も遭遇したエラーについてです。
ショッピング系アプリを作成中、購入機能を実装している時に出会いました。

ActiveRecord::RecordNotFound in OrdersController#index

ActiveRecord::RecordNotFound

Couldn't find Item without an IDの部分に注目してください。
英語の問題になりますが、この文章は要するに「ItemのIDは見つかりませんでした」とエラーを伝えてくれてます。
上記のエラー画面を参照すると具体的なエラー箇所も表示してくれており、

def index
  @item = Item.find(params[:id])
end

の部分が原因である、と教えてくれています。

解決方法

上記にも書きましたが、Itemのparams[:id]が何を示しているのかわかりません、ということです。
この行についてID見つからないということはparams[:id])をどうにか修正すれば解消できるのでは、と考えました。
エラー下部のRequestの部分を見るとparameterとして["item_id"==>"2"]として考えてくれてます。

ActiveRecord::RecordNotFoundを解消するためのヒント
なので、params[:id]をより詳しく指定するためparams[:item_id]に修正しました。
修正後のコードは下記です。

def index
  @item = Item.find(params[:item_id])
end


find メソッドに渡している params[:id] がどこから来ているのかを確認して、そこを正しい値が渡ってくるように修正すれば解消するエラーでした。

どうしてエラーが発生したのか

今回@item = Item.find(params[:id])を記述していたコントローラはItemsコントローラー(商品管理機能)ではなく、Ordersコントローラー(購入機能)だったため、参照するモデルを自動で考えてくれるRubyに甘えていたことが、個人的な原因だと感じました。 そのため、指定した id に相当するレコードがOrderテーブルに無いことが原因となってしまったのではないかと思いました。

まとめ

・モデルに対応するコントローラーでない場合は、どのテーブルに対する処理なのかをしっかり考える。
Rubyは非常に頭の良い言語ではあるが、そのために自分の甘えが出てしまうことがある。

エラーの画面が出るとドキッとしますが、しっかりエラー文を読めば対処法がわかることは多いので、しっかり冷静に受け止めていきたいです。