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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

1015閲覧

Couldn't find User with 'id'=6 を解消したい。

syosinsya123

総合スコア3

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2021/10/12 05:55

前提・実現したいこと

カレンダーに登録した予定を削除できるようにしたいと考えております。

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

予定を削除しようと作成したリンクをクリックした際に、
ActiveRecord::RecordNotFound in TrainingsController#destroy
が表示されデータの削除及びindexページに遷移ができない状態です。
下記リンクがエラーメッセージの画像です。

https://gyazo.com/09ed7b7a6f0990baaf43639f07b041b3 https://gyazo.com/06b54b132c16af9fb4c4ccb003a0bea8

該当のソースコード

routes.rb

ruby

1Rails.application.routes.draw do 2 devise_for :users 3 root to: "users#index" 4 resources :user do 5 resources :trainings, only: [:index, :new, :create] 6 end 7 resources :trainings, only: [:show, :edit, :update, :destroy] 8 post 'posts', to: 'trainings#create' 9 get 'trainings', to: 'trainings#index' 10end

trainings.controller.rb

ruby

1class TrainingsController < ApplicationController 2 before_action :set_user, except: [:index, :show, :create] 3 def index 4 @trainings = current_user.trainings 5 end 6 7 def show 8 @trainings = current_user.trainings.find(params[:id]) 9 end 10 11 def new 12 @trainings = current_user.trainings 13 end 14 15 def edit 16 @training = current_user.trainings.find(params[:id]) 17 end 18 19 def update 20 @training = current_user.trainings.find(params[:id]) 21 @training.update(update_params) 22 redirect_to trainings_path 23 end 24 25 def create 26 @training = current_user.trainings.new(training_memo) 27 if @training.save 28 redirect_to trainings_path 29 else 30 redirect_to new_training_path 31 end 32 end 33 34 def destroy 35 @trainings = current_user.trainings.find(params[:id]) 36 @trainings.destroy 37 redirect_to trainings_path(@user.id) 38 end 39 40 41 private 42 def training_memo 43 params.permit(:start_time, :title, :content, :user_id) 44 end 45 46 def set_user 47 @user = User.find(params[:id]) 48 end 49 50 def update_params 51 params.require(:training).permit(:start_time, :title, :content, :user_id) 52 end 53end

show.html.erb

ruby

1<%= render partial: 'shared/header' %> 2 3<table class="table"> 4 <thead> 5 <tr> 6 <th>トレーニング名</th> 7 <th>トレーニング内容</th> 8 <th></th> 9 <th></th> 10 </tr> 11 </thead> 12 <tbody> 13 <tr> 14 <td><%= @trainings.title%></td> 15 <td><%= @trainings.content%></td> 16 <td><%=link_to "削除", training_path(@trainings.id), method: :delete , data: {confirm:"削除しますか?"} ,:class=>"btn03"%></td> 17 <tr> 18 </tbody> 19</table>

index.html.erb

ruby

1<head> 2 <meta charset="utf-8"> 3 <meta name="viewport" content="width=device-width, initial-scale=1"> 4 <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.3/css/bulma.min.css"> 5</head> 6 7<nav class="navbar is-primary" role="navigation" aria-label="main navigation"> 8 <div id="example" class="py-5 navbar-menu"> 9 <div class="navbar-start"> 10 <a class="navbar-item" href="/">Your Training</a> 11 </div> 12 <div class="navbar-end"> 13 <div class="navbar-item"> 14 <% if user_signed_in? %> 15 <%= link_to "ログアウト", destroy_user_session_path, method: :delete %> 16 <%= link_to "マイページ", trainings_path %> 17 <% else %> 18 <%= link_to "ログイン", new_user_session_path, class: "post" %> 19 <%= link_to "新規登録", new_user_registration_path, class: "post" %> 20 </div> 21 <% end %> 22 </div> 23 </div> 24 </div> 25</nav> 26 27<div class="columns"> 28 <div class="column is-three-quarters"> 29 <%= month_calendar events: @trainings do |date, trainings| %> 30 <%= date.day %> 31 <% trainings.each do |training| %> 32 <div> 33 <%= link_to training.title, training_path(training.id) %> 34 </div> 35 <% end %> 36 <% end %> 37 </div> 38 <div class="column"> 39 <div class="field"> 40 <%= form_with model: @user, url: "/posts", method: :post, local: true do |f|%> 41 <label class="label">タイトル</label> 42 <%= f.text_field :title %> 43 <label class="label">トレーニング内容</label> 44 <%= f.text_area :content%> 45 <label class="label">トレーニングをした日</label> 46 <%= f.date_select :start_time%> 47 <%= f.submit '記録する'%> 48 <% end %> 49 </div> 50 </div> 51</div>

試したこと

rails routesで削除ボタンのパスに必要な引数を確認し上記のように修正したり、@trainings.user.idに変更したりしましたが、解消できませんでした。

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

gem 'rails', '~> 6.0.0'

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

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

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

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

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

guest

回答1

0

ベストアンサー

えっと、

ruby

1@trainings = current_user.trainings.find(params[:id]) 2@user = User.find(params[:id])

destroyのアクション時にはこの両方が動作するのですが、idはどちらを指したものなのでしょうか?

投稿2021/10/12 07:06

maisumakun

総合スコア145208

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

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

syosinsya123

2021/10/12 07:40

お忙しいところ回答頂きありがとうございます。 idについては、@user = User.find(params[:id])でuserについてのidを取得して欲しいところを、trainingのidが入ってしまい、id=6のレコードを持っているuserはいないというエラーになっております。
maisumakun

2021/10/12 07:43

idを流すべきはtrainingの方なのではないでしょうか?(trainingに紐づくuserは一意に決まります)
syosinsya123

2021/10/12 08:00

userを1から取得しないと紐づけられないと勘違いをしておりました。 今一度自身で流れについて確認したところ、set_userにてuserのidを取得しなくても@trainings = current_user.trainings.find(params[:id])と記述しているので、maisumakun様の仰る通り、流すべきはtrainingのidだと再認識致しました。 そこでset_userの処理とbefore_actionをコメントアウトし、destroyアクションのredirect_toの引数を削除し再度実行した結果データの削除ができ、ページ遷移もできました。 今回のエラーの要因は、userのidを二重で取得しようとした結果ということでしょうか?
maisumakun

2021/10/12 08:02

> 今回のエラーの要因は、userのidを二重で取得しようとした結果ということでしょうか? trainingのidでuserを取得しようとしていたことです。
syosinsya123

2021/10/12 08:16

失礼致しました。 trainingのidを渡してきていたにも関わらずuserのidを取得しようとしていたことでした。 一旦このまま実装を進めてまた不明点等あれば質問させて頂きます。 お時間を割いてご教授頂き、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問