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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

2343閲覧

Couldn't find List with 'id'=1の理由が知りたいです

asatuki

総合スコア13

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/01/13 11:14

「Ruby on Rails」に現在取り組んでいるのですが、「destoryアクション」を導入し、削除機能を追加しようと考えました。

また、データ削除後のリダイレクト先は、投稿一覧ページにしようと「indexアクション」にも手を加えました。

しかし、削除機能追加後にサーバーを起動しようとしたら、

ActiveRecord::RecordNotFound in TodolistsController#show Couldn't find List with 'id'=1 Extracted source (around line #21): 19 20 21 22 23 24 def show @list = List.find(params[:id]) end def edit

という表示がされてしまいました。

色んなサイトを調べ、実行してみましたが結局分からず・・・。
誠に勝手ながら、分かる方がいらっしゃいましたら、助言の方いただきたいです。

**todo lists_controller.rb** class TodolistsController < ApplicationController def new @list = List.new end def create list = List.new(list_params) list.save redirect_to todolist_path(list.id) end def index @lists = List.all(params[:id]) end def show @list = List.find(params[:id]) end def edit @list = List.find(params[:id]) end def update list = List.find(params[:id]) list.update(list_params) redirect_to todolist_path(list.id) end def destroy list = List.find(params[:id]) list.destroy(list_params) redirect_to todolists_path(list.id) end private def list_params params.require(:list).permit(:title, :body, :image) end end
**index.html.erb** <h1>投稿一覧</h1> <% @lists.each do |list| %> <p>タイトル</p> <span> <%=link_to list.title, todolist_path(list.id) %> </span>  <p>画像</p> <%= attachment_image_tag list, :image, :fill, 100, 100, format: 'jpeg' %> <% end %>
**show.html.erb** <h2>タイトル</h2> <p><%= @list.title %></p> <h2>本文</h2> <p><%= @list.body %></p> <h2>画像</h2> <%= attachment_image_tag @list, :image, :fill, 300, 300, format: 'jpeg' %> <%= link_to "編集", edit_todolist_path(@list.id) %> <%= link_to "削除", destroy_todolist_path(@list.id), method: :delete, "data-confirm" => "本当に削除しますか?" %>
**routes.rb** Rails.application.routes.draw do get 'todolists/new' # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html get "top" => "homes#top" post 'todolists' => 'todolists#create' get "todolists" => "todolists#index" get 'todolists/:id' => 'todolists#show', as: 'todolist' get "todolist/:id/edit" => "todolists#edit", as: "edit_todolist" patch "todolists/:id" => "todolists#update", as: "update_todolist" delete "todolists/:id" =>"todolists#destroy", as: "destroy_todolist" end

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

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

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

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

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

winterboum

2020/01/13 11:27

起動時にでたエラーですか? indexでlinkをclickした時にでたエラーですか?
winterboum

2020/01/13 11:31

List.all(params[:id]) このparams[:id] は どういう効果を期待していますか
asatuki

2020/01/13 14:55

返事が遅れてしまい、すみません。 上記のエラーは、サーバーを起動し、ページを実際に開いた際に出てきたものです。 「List.all(params[:id])」の件は、私自身の不勉強で大変恥ずかしのですが、色々と考えた末に、データ削除後に投稿一覧のページに戻したいのなら、「indexアクション」にも「params[:id]」を入れた方がいいのでは?という考えに何故か至り導入しました。
winterboum

2020/01/14 00:08

1)index で表示 2)一覧の,Todolist 毎のlinkをclick 1)は成功、2)でエラーですね?
asatuki

2020/01/14 00:19

はい、それで間違いありません
winterboum

2020/01/14 00:38

困った、とするとわからん、 indexで <%=link_to list.title, todolist_path(list.id) %> が破綻していない ということは list はある。 ということは list.idは実在のid、 なのに List.find(params[:id]) では無いと言われる。
asatuki

2020/01/15 10:02

解決することができました。 ありがとうございます。
guest

回答1

0

ベストアンサー

原因

id=1 のデータが存在しないのに、それを表示させようとしたため、エラーが発生しています。

destroy アクションの一番最後のコードが問題です。

rb

1 def destroy 2 list = List.find(params[:id]) 3 list.destroy(list_params) 4 redirect_to todolists_path(list.id) # ← こいつが犯人 5 end

直前のコードでデータを削除しているのに、その削除した id の詳細画面(showアクション)にリダイレクトしちゃってますから、必ずエラーになってしまいます。

対策

削除後は index アクション(todolists_path)に飛ばすと良いかと思います。

rb

1 def destroy 2 list = List.find(params[:id]) 3 list.destroy 4 redirect_to todolists_path 5 end

気になること

ちなみに、質問文に記載されているコードは、実際に動かしたコードをそのまま貼り付けたのではなく、質問する際に改めて書き直したものでしょうか・・・?

list.destroy(list_params)todolists_path(list.id) といった記述だと、ArgumentError という、もっと別のエラーが発生しそうな気がしますが・・・。

index アクションの

rb

1@lists = List.all(params[:id])

も、正しくは

rb

1@lists = List.all

と書かないと動かないような。

投稿2020/01/15 07:44

編集2020/01/15 07:53
shinoharat

総合スコア1676

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

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

asatuki

2020/01/15 10:02

ご指摘を頂いた部分を訂正したところ、無事起動することができました。 本当にありがとうございます。 コードの件ですが、ご指摘通り質問する際に書き直した物になります。 正確には、自分で色々といじる前のコードになります。 もしかしたら、自分が余計なところを消しているのでは?と思い、いじる前のコードを貼り付けました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問