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

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

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

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

Q&A

解決済

1回答

503閲覧

destoryアクションのid指定に関して

osuzumaru

総合スコア9

Ruby on Rails

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

0グッド

0クリップ

投稿2020/05/14 15:02

user/1/todo/11をdestroyしたいのですがなぜかuser/11/todo/1を取得しようとしてしまい下記のエラーが表示されてしまいます。
https://gyazo.com/b9f75773d7a2cfece851fe40d3beb804
確認として
todoscontrollerのcreateアクションでbinding.pryをしparamsの中身を確認した所、

[1] pry(#<TodosController>)> params => <ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"isyRfVo/DKCgH2e5YyizV9qOOlibrN1Wq1q969tqHREHngpUb0fLE8dDXcmgv+Qpo68vlwqsnsR2u/i5thz9TQ==", "todo"=>{"content"=>"掃除する"}, "commit"=>"SEND", "controller"=>"todos", "action"=>"create", "user_id"=>"1"} permitted: false> [2] pry(#<TodosController>)> todo_params User Load (0.3ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 ORDER BY `users`.`id` ASC LIMIT 1 ↳ app/controllers/todos_controller.rb:23 => <ActionController::Parameters {"content"=>"掃除する", "user_id"=>1} permitted: true> [3] pry(#<TodosController>)> exit

となっており思い通りに保存できています。
しかし保存した内容をdestroyする際に上記エラーが発生します。下記destroyした時の中身になります。

[1] pry(#<TodosController>)> params => <ActionController::Parameters {"_method"=>"delete", "authenticity_token"=>"WJFFIXyYvgVAQ6HFODOI9zzbjKMPuOI5wn39Pn9AFL7Vw94ISeB5ticfm7X7pN+JRfqZbJ64oasfnLhsEjb04g==", "controller"=>"todos", "action"=>"destroy", "user_id"=>"11", "id"=>"1"} permitted: false> [2] pry(#<TodosController>)> Started GET "/users/1" for ::1 at 2020-05-14 23:25:28 +0900 [2] pry(#<TodosController>)> exit

エラー原因としてはuser_id:1のcontent:11を削除したいのですが,user_id:11のcontent:1を削除しようとしていることだと考えています。

class TodosController < ApplicationController def create @todo = Todo.create(todo_params) respond_to do |format| format.html { redirect_to user_path(params[:user_id]) } format.json end end def destroy todo=Todo.find(params[:id]) if todo.destroy redirect_to "/users/#{current_user.id}", notice: '削除が完了しました' else flash.now[:alert] = '削除できませんでした' render :destroy end end private def todo_params params.require(:todo).permit(:content).merge(user_id: current_user.id) end end
class UsersController < ApplicationController before_action :authenticate_user!, only: [:following, :followers] def show @user=User.find(params[:id]) @image = @user.image @profile=@user.profile @nickname=@user.nickname @posts=@user.posts.order("created_at DESC") @todo=Todo.new @todos = @user.todos.includes(:user) end     ~省略~ private def user_params params.require(:user).permit(:id, :name, :email, :image, :profile) end end

usershowhtml

1 .todo_form 2 - if current_user == @user 3 = form_with model: [@user, @todo], local: true, id: "new_todo" do |f| 4 = f.text_field :content, placeholder: "to-do", rows: "2", class: "todo_box" 5 = f.submit "SEND", class: "form_submit" 6 - else 7 %strong 8 %p ※※※ TO-Doの投稿には新規登録/ログインが必要です ※※※ 9 .todo-box 10 - if @todos 11 - @todos.each do |todo| 12 %p 13 %strong 14 = todo.content 15 %span 16 =link_to '削除', user_todo_path(todo.id), method: :delete,class:"delete" 17
Rails.application.routes.draw do devise_for :users root "posts#index" resources :posts do resources :comments, only: :create collection do get 'search' end end resources :categories, only: :show resources :users, only: [:show, :edit, :update] do resources :todos, only: [:create, :destroy] member do get :following, :followers end end resources :relationships, only: [:create, :destroy] end

routingの問題なのかシンプルに記述が間違っているのかなど検討してみましたが答えが見つからなかったため質問しました。
初歩的な質問かもしれませんがご教授いただけると助かります。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

自己解決

自己解決いたしました!
users/show.html.hamlの
=link_to '削除', user_todo_path(todo.id), method: :delete,class:"delete"

=link_to '削除', "/users/#{current_user.id}/todos/#{todo.id}", method:
:delete,class:"delete"
とした所削除できるようになりました。
おそらく、user_todo_path(todo.id)ではログインしているユーザの特定ができていなかっただけだったのかもしれません。
一度は目を通し考えてくださったみなさんありがとうございました。

投稿2020/05/14 16:08

osuzumaru

総合スコア9

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問