質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

1695閲覧

Couldn't find Memo with 'id'=#<Memo::ActiveRecord_Relation:0x00007fccab8e68c0>を解決したいです

myxo

総合スコア2

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2020/05/13 15:15

編集2020/05/13 15:54

前提・実現したいこと

railsで簡単なメモアプリ を作っています。
show機能を使って、メモ一覧を出力するときに、showにいくリンクをクリックすると、下記のエラーが発生しました。
仮データとして、mysqlにて、memoテーブルに、foodカラム,limit_dateカラム,user_idカラム(のちにuser登録するため)があり、全てデータを入力して作成しております。

発生している問題・エラーメッセージ

ActiveRecord::RecordNotFound in MemosController#show Couldn't find Memo with 'id'=#<Memo::ActiveRecord_Relation:0x00007fccab8e68c0> Extracted source (around line #16): def show @memos = Memo.find(params[:id]) end private

ターミナル

Started GET "/memos/%23%3CMemo::ActiveRecord_Relation:0x00007fd62b9f6470%3E" for ::1 at 2020-05-14 00:02:19 +0900 Processing by MemosController#show as HTML Parameters: {"id"=>"#<Memo::ActiveRecord_Relation:0x00007fd62b9f6470>"} Memo Load (14.2ms) SELECT `memos`.* FROM `memos` WHERE `memos`.`id` = 0 LIMIT 1 Completed 404 Not Found in 21ms (ActiveRecord: 14.2ms) ActiveRecord::RecordNotFound (Couldn't find Memo with 'id'=#<Memo::ActiveRecord_Relation:0x00007fd62b9f6470>): app/controllers/memos_controller.rb:16:in `show' Rendering /Users/Owner/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/actionpack-5.0.7.2/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout Rendering /Users/Owner/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/actionpack-5.0.7.2/lib/action_dispatch/middleware/templates/rescues/_source.html.erb Rendered /Users/Owner/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/actionpack-5.0.7.2/lib/action_dispatch/middleware/templates/rescues/_source.html.erb (4.3ms) Rendering /Users/Owner/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/actionpack-5.0.7.2/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb Rendered /Users/Owner/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/actionpack-5.0.7.2/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (19.2ms) Rendering /Users/Owner/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/actionpack-5.0.7.2/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb Rendered /Users/Owner/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/actionpack-5.0.7.2/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (1.0ms) Rendered /Users/Owner/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/actionpack-5.0.7.2/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout (224.6ms)

該当のソースコード

ruby

1class MemosController < ApplicationController 2 def index 3 @memos = Memo.include(:user) 4 end 5 6 def new 7 @memo = Memo.new 8 end 9 10 def create 11 Memo.create(memo_params) 12 redirect_to root_path 13 end 14 15 def show 16 @memos = Memo.find(params[:id]) 17 end 18 19 private 20 def memo_params 21 params.require(:memo).permit(:food, :limit_date).merge(user_id: current_user.id) 22 end 23 24end 25

下記はindexのHTMLです。1行目に詳細ページへすぐ飛べるよう仮でリンク付けてます。

ruby

1.left-contents 2 = link_to memo_path(@memo) do 3 詳細ページ 4 5 .upper-content 6 .title 使い切る食材たち 7 %form 8 .formbox 9 .formbox__food FOOD 10 %input{type:"text", class:"formbox__food__name", placeholder: " type a food name"} 11 .formbox__date LIMIT! 12 %input{type:"date", class:"formbox__date__limit"} 13 .btn 14 %input{type:"submit", class:"submit-btn", value:"add food"} 15 16 17 .main-content 18 19 .title-content 20 .title-content__food 21 22 Food Name 23 .title-content__limit 24 Limit Date 25 .list 26 .list__foods 27 - @memos.each do |memo| 28 .list__foods__one 29 = icon('fas','fish') 30 = memo.food 31 32 .list__limit 33 - @memos.each do |memo| 34 .list__limit__date 35 = icon('fas', 'exclamation-triangle') 36 = memo.limit_date 37 .list__edit-btn 38 編集 39 .list__delete-btn 40 削除

ルーティング設定

Rails.application.routes.draw do devise_for :users root to: 'memos#index' resources :memos, only: [:index, :new, :create, :show] end

試したこと

rails routes

root GET / memos#index memos GET /memos(.:format) memos#index POST /memos(.:format) memos#create new_memo GET /memos/new(.:format) memos#new memo GET /memos/:id(.:format) memos#show

他の質問者さんもつまずいている方がいらっしゃたので、参考にしながら解決できないか検討しました。
表題のエラーは、idがないのに、そこに行こうとしているということはわかりました。
また、ルーティングの設定に誤りがないことも、確認しました(念のため載せております)
ただ、mysqlで仮データを入力しており、idも入っているので、なぜ何もないと言われるのかまで、原因を追及することができませんでした。

初歩的なミスかもしれませんが、ご教授頂けますと助かります。
どうぞよろしくお願い致します。

補足情報(FW/ツールのバージョンなど)

Rails 5.0.7.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

エラーが起きたのが= link_to memo_path(@memo)をclickした時であるとすると、viewのcodeとエラーが一致しません。載せているcodeはエラーのときのものではないですね?
エラーのときは = link_to memo_path(@memos) だったのでは。
載っているcodeですと、def show の @memos = Memo.find(params[:id])で @memosがnilになって、show のviewで「nilにそんなmethodない」というエラーになっているとおもう。

「1行目に詳細ページへすぐ飛べるよう仮でリンク付けてます。」とありますが、このときどの memoの詳細に行きたいのですか?
その@memoを def index で用意する必要があります。
が、
やりたいのは一覧に出てくるMEMOのなかで、「これ」の詳細をみたいのでは?
とすると

.list__edit-btn 編集 .list__delete-btn 削除

に並べて

.list__show-btn = link_to '詳細',memo_path(memo)

です

なお、showなのに @memos と複数形はやめたほうが良いです。あとで混乱します。

投稿2020/05/13 23:32

winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

myxo

2020/05/14 00:15 編集

ご回答、ありがとうございます。ご指摘いただいた通り、もともと`= link_to memo_path(@memos) `としておりました。そして、表題はそのとき出たエラーです。 ご指摘いただいた通り、 def showの部分を`@memo= Memo.find(params[:id])`に、 ``` .list__show-btn =link_to '詳細', memo_path(memo) ``` に変更してみました。 しかし、下記のようなエラーが出てしまします。 私が質問を載せる前に、試行錯誤していたエラーの1つでしたので、こちらも知識不足により、原因がわかりませんでした。 https://gyazo.com/d8a72940eba3d332a96e4ddb7416c8b1 ターミナル ``` Started GET "/" for ::1 at 2020-05-14 09:07:57 +0900 Processing by MemosController#index as HTML Rendering memos/index.html.haml within layouts/application User Load (10.9ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 ORDER BY `users`.`id` ASC LIMIT 1 Memo Load (4.8ms) SELECT `memos`.* FROM `memos` User Load (1.0ms) SELECT `users`.* FROM `users` WHERE `users`.`id` IN (1, 2) Rendered memos/_left-contents.html.haml (369.6ms) Rendered memos/index.html.haml within layouts/application (397.2ms) Completed 500 Internal Server Error in 428ms (ActiveRecord: 16.7ms) ActionView::Template::Error (undefined local variable or method `memo' for #<#<Class:0x00007fa30200c3a8>:0x00007fa2fe705488> Did you mean? @memos): 37: .list__delete-btn 38: 削除 39: .list__show-btn 40: = link_to '詳細',memo_path(memo) app/views/memos/_left-contents.html.haml:40:in `_app_views_memos__left_contents_html_haml__4290259640869936599_70169004084820' app/views/memos/index.html.haml:23:in `_app_views_memos_index_html_haml___1291582122517671285_70169015106340' Rendering /Users/Owner/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/actionpack-5.0.7.2/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb within rescues/layout Rendering /Users/Owner/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/actionpack-5.0.7.2/lib/action_dispatch/middleware/templates/rescues/_source.html.erb Rendered /Users/Owner/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/actionpack-5.0.7.2/lib/action_dispatch/middleware/templates/rescues/_source.html.erb (10.1ms) Rendering /Users/Owner/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/actionpack-5.0.7.2/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb Rendered /Users/Owner/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/actionpack-5.0.7.2/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (16.7ms) Rendering /Users/Owner/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/actionpack-5.0.7.2/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb Rendered /Users/Owner/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/actionpack-5.0.7.2/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (1.5ms) Rendered /Users/Owner/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/actionpack-5.0.7.2/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb within rescues/layout (546.0ms) ``` お手数おかけして申し訳ありません。 再度教えていただけますでしょうか。 よろしくお願い致します。
winterboum

2020/05/14 00:18

- @memos.each do |memo| のloopの中に入れてください
myxo

2020/05/14 00:34

無事に解決できました。 的確なご指摘、迅速な回答、本当にありがとうございました。 また、自身がコントロールとビューの関係がまだまだ勉強不足だということも、改めてわかりました。 ベストアンサーとさせていただきます。
guest

0

上記のコードが全てなのであれば恐らくですが、

def index @memos = Memo.include(:user) end

@memosと複数形になっており、この中には複数のレコードデータがふくまれていると考えられます。

そしてindexのHTML側を確認すると、

= link_to memo_path(@memo) do 詳細ページ

となっていますが、渡しているのは先程の@memosではなく@memoと単数形になっています。
ここで渡す値は確かに1レコード分のデータとなるのですが、
indexアクションから渡された値は複数系の@memosですので@memoを渡すことはできません。
渡すのであればHTMLコードの下の方に書かれているようにeach文で回すなどして1つずつ取り出し、
引数として渡してあげる必要があるのかなと思います。

投稿2020/05/13 16:21

gnfreeworks

総合スコア306

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

myxo

2020/05/14 00:38

ご教授いただき、ありがとうございます。 ご指摘通り、コントローラーとビューの流れの理解がしっかりできていなことから、今回のエラーが発生しておりました。 無事に解決することができました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問