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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

1200閲覧

ActiveRecord::RecordNotFound in

rayi0630

総合スコア9

Ruby on Rails 5

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/02/24 15:35

##小説サイトを参考に真似をし練習中に起きたエラーです。

テーブル名
・novel_lists 
・users
多(novel_losts):1(users)の関係です。

novel_listsには
・title
・genre
・novel_keyword
・synopsis
・user_id  以上の5つのカラムがあります。

今回usersのshow.html.erbファイルに

<% @novel_list.each do |novel_list| %> <div class="novellist_toptable"> <tbody> <tr> <td><%= link_to novel_list.title, novel_list_path(novel_list) %></td> <td><%= novel_list.genre %></td> </tr> <tr> <td></td> </tr> </tbody> </table> </div> <% end %> このように記載し、novel_list_pathへとlinkをつなげています。 このlinkを踏んだ際に出るエラーとなります
まずはusersコントローラのshowアクションの部分です。 class UsersController < ApplicationController def show @user = User.find(params[:id]) @novel_list = @user.novel_lists @followings = @user.followings.page(params[:page]) @novel_lists = NovelList.all @favposts = current_user.favposts.page

###エラー内容

ActiveRecord::RecordNotFound in NovelListsController#show Couldn't find User with 'id'=4 Extracted source (around line #9): def show @user = User.find(params[:id])ここの部分にエラーが出ています。 @novel_list = NovelList.find(params[:id]) @novel_post = NovelPost.find(params[:id]) @novel_posts = @novel_list.novel_posts

そしてエラーはNovelListsControllerといってるので、

novel_listsコントローラです。 class NovelListsController < ApplicationController def show @user = User.find(params[:id]) @novel_list = NovelList.find(params[:id]) @novel_post = NovelPost.find(params[:id]) @novel_posts = @novel_list.novel_posts end

現在自分の投稿だけを表示し、linkを踏むとNovelList id:3 には行く事が出来ます。
しかし、次に作った、id:4,5,6に飛ぶと上記のエラーが出ます。

rails コンソールでNovelList.all をした結果となります。新しく追加した、genreとnovel_keywordがnilとなってしまっております。 NovelList Load (0.3ms) SELECT `novel_lists`.* FROM `novel_lists` LIMIT 11 => #<ActiveRecord::Relation [#<NovelList id: 1, title: "異世界転生○○○", user_id: 1, created_at: "2020-02-21 15:21:45", updated_at: "2020-02-21 15:21:45", genre: nil, novel_keyword: nil, synopsis: nil>, #<NovelList id: 2, title: "異世界をスマホ一つで旅をする", user_id: 1, created_at: "2020-02-22 05:12:01", updated_at: "2020-02-22 05:12:01", genre: nil, novel_keyword: nil, synopsis: nil>, #<NovelList id: 3, title: "女神様・・・・・", user_id: 3, created_at: "2020-02-22 05:39:48", updated_at: "2020-02-22 05:39:48", genre: nil, novel_keyword: nil, synopsis: nil>, #<NovelList id: 4, title: "僕たちは・・・・テストテスト異世界転生", user_id: 3, created_at: "2020-02-23 14:13:02", updated_at: "2020-02-23 14:13:02", genre: nil, novel_keyword: nil, synopsis: nil>, #<NovelList id: 5, title: "ダンジョンがあらわれた!!", user_id: 3, created_at: "2020-02-24 14:30:39", updated_at: "2020-02-24 14:30:39", genre: nil, novel_keyword: nil, synopsis: "ダンジョンが・・・・\r\n・・・・テスト中">, #<NovelList id: 6, title: "テストダンジョン", user_id: 3, created_at: "2020-02-24 15:04:30", updated_at: "2020-02-24 15:04:30", genre: nil, novel_keyword: nil, synopsis: "テスト">]> 2.5.3 :002 >

###気づいた事。
id:4は、新しくgenreを追加しgenreを選んでから投稿しています。

id:5,6はgenre , novel_keyword ,synopsissを追加した後、選択して投稿しています。

これらが関係するのかと思ったのですが、エラーが出ているのは@user = User.find(params[:id])部分なので、
見当違いかも知れません、。

###試した事

resources :novel_lists, only: [:index, :show, :new, :create, :edit, :update, :destroy] do 現在、novel_lists単体でルーティングしています。 それを resources :users, only: [:index, :show, :new, :create, :edit, :update, :destroy] do resources :novel_lists, only: [:index, :show, :new, :create, :edit, :update, :destroy] とネストをしてuser_idが繋がるようにしたら直るかと思いしたのですが・・・エラーは変化なしでした。 その他にも、link_toで渡している(novel_list)にuserを含めようと、 def show に @novel_lists = @user.novel_listsと記載し、each文を変更したりもしてみましたが変わらずでした。

原因がわかりません。わかる方おられましたら、よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラー文に"Couldn't find User with 'id'=4"と書いてあります。意味としては、「id=4のユーザーはないよ」と言っています。なぜ、このようなことになっているかというと、novel_listsコントローラで@user = User.find(params[:id])としているからです。
今、id=4のノベルをクリックしているのでparams[:id]の値は4となります。なので、id=4のユーザーを探しに行った結果、id=4のユーザーは存在しないよと言っています。

そもそも、novel_listの中にユーザーidの情報が入っているので、そこでわざわざ@userとしなくていいと思います。Novel_listテーブルとUserテーブルをアソシエーションで結んでいれば、例えば、ビュー側で@novel_list.user.nameとすれば、ユーザーの情報は表示できると思います。

投稿2020/02/24 16:51

clora

総合スコア72

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

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

rayi0630

2020/02/25 12:36

ご解答ありがとうございます。 ``` @user = User.find(params[:id])としているからです。 今、id=4のノベルをクリックしているのでparams[:id]の値は4となります。なので、id=4のユーザーを探しに行った結果、id=4のユーザーは存在しないよと言っています。 ``` ここがとても勉強になりました。今まで書いてあれば取得できる程度にしか考えておらず、 user_idが必要な場面がnovel_listsのshowアクションであったので、追加していたのですが・・・ 不要なものを加えた事で、エラーが出ていたのですね。 @userを削除し、 @novel_list.user.nameに変更する事で表示する事が出来ました。 詳しく説明頂き、ありがとうございました。
clora

2020/02/25 14:14

ファイト!
rayi0630

2020/02/25 14:25

ありがとうございます。頑張ります!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問