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

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

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

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

Q&A

解決済

2回答

1966閲覧

削除メッセージは出るが、destroyメソッドでの削除ができていない

rayi0630

総合スコア9

Ruby on Rails 5

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

0グッド

0クリップ

投稿2020/02/11 13:59

編集2020/02/11 14:01

前提・実現したいこと

現在railsにてトークルームにてチャットが出来るアプリを製作中です。
基本的な機能は問題なくできておりますがマイページでの削除機能が上手く機能していません。

削除しようとしているのはtalk_post_roomsテーブルに保存されている、トークをする為の部屋のデータです。
それに紐づく usersテーブル、talk_postsテーブル、categoriesテーブル、faboritesテーブルを同時に削除するように、
それぞれdependent: :destroyをrbファイルにて付けてあります。

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

削除ボタンを押すとメッセージを削除しました。ときちんとリダイレクトされるのですが、 実際にはマイページに載せてる一覧自体が残ってしまっており、何度削除ボタンを押しても消えずに残ってしまってる状態です。 関係あるかは不明ですが、デベロッパーツールにて削除ボタンを押した後に、 Networkを見ると、削除ボタンが関わってるであろうファイルが302とステータスがなっています。

該当のソースコード

rails

1 2talk_post_roomsコントローラ 3def destroy 4 @talk_post_room = TalkPostRoom.find(params[:id]) 5 @talk_post_room.destroy 6 flash[:success] = 'トークルームを削除しました。' 7 redirect_to user_path(current_user) 8 end 9 10users/show.html.erb 11<%= link_to "削除", talk_post_room_path(@talk_post_room), method: :delete, data: { confirm: "本当に削除しますか?" }, class: 'btn btn-danger btn-sm' %> 12

試したこと

ルーティングの順番がおかしいのかと思い、

・get 'talk_post_rooms/destroy'を一番上に配置し別のルーティングにより阻害されていないかの確認。 ・talk_post_roomのidが上手く渡っていないのかと思い。確認のためデベロッパーツールのHTMLを確認。 <a data-confirm="本当に削除しますか?" class="btn btn-danger btn-sm" rel="nofollow" data-method="delete" href="/talk_post_rooms/1">削除</a> idはどうやらしっかりと渡っている模様。 dependent: :destroyで出来ていないところがあるかのチェックをしたが、コードを削除してみたりして試すが、 そもそも出来ていないとエラーが出たので、出来てると確認。 ・rails routesでルーティング確認。 DELETE /talk_post_rooms/:id(.:format) talk_post_rooms#destroy HTMLと一致してるので問題なし。 ・binding.pryにてデバックで確認。 [4] pry(#<TalkPostRoomsController>)> @talk_post_room.destroy (0.4ms) BEGIN ↳ (pry):4 TalkPostRoomPost Load (0.2ms) SELECT `talk_posts`.* FROM `talk_posts` WHERE `talk_posts`.`talk_post_room_id` = 1 ↳ (pry):4 TalkPost Destroy (0.2ms) DELETE FROM `talk_posts` WHERE `talk_posts`.`id` = 1 ↳ (pry):4 (2.4ms) ROLLBACK ↳ (pry):4 => false talk_postsのidが取得出来ず、RoLLBACKになっているのでしょうか? dependent: :destroyによって紐づいてるものを削除できるので、 この記述だけで問題ないと思ったのですが、 def destroy @talk_post_room = TalkPostRoom.find(params[:id]) @talk_post_room.destroy flash[:success] = 'トークルームを削除しました。' redirect_to user_path(current_user) end @talk_post_roomにtalk_post_id を入れて上げないとダメなのでしょうか? @talk_post = TalkPost.find(params[:id])でidを取得して、 @talk_post_room.talk_post_id = @talk_post.id としてidを入れて上げようとするとtalk_postのメソッドエラーとなります。 @talk_post_rooms = @talk_post_room.talk_posts とするとエラーは出ませんが、やはりルームを削除しました。と出るだけでusers/showに表示している削除したものは消えておりません。 どこを修正すれば良いのかが、検討も付かなくなっている状態です。 何かアドバイスを頂けると有り難いです。よろしくお願いします。

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

AWSのC9にてコードを書いています。

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

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

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

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

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

guest

回答2

0

ベストアンサー

logそれで合っています。
関連付けを拝見すると dependent: :destroy が双方向、網目の目のようにがんじがらめにかかっています。それが原因ではないかと思われます。

TalkPost を消すために まず talk_post_room を消す
そのためにまず user と categoryを消す
userを消すためにまず talk_posts,talk_post_rooms,categories,favoritesを消す
とぐるぐる周りになってしまってます。それでこりゃ無理!と諦めたのでは。
(実装まで見ていないので想像)

User has many talk_posts な中の一つの talk_postを消すときに一蓮托生全部のtalk_postもろともuserも削除したいのでしょうか?
違うような気がします。
文法的にはbelongs_toからもhas_manyからもdependent: :destroy は可能になっていますが、実際の系では場合によりどうでしょう?

このケースでは Userを消したら一連託生はありますが、逆方向はなしでは?

こいつを消したら意味が無くなるもの に対してのみその方向でのdependent: :destroyをつけるようにしてください

投稿2020/02/11 23:49

winterboum

総合スコア23567

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

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

rayi0630

2020/02/12 08:14

回答ありがとうございます。 TalkPostRoomにて、talk_postとfavoritesとcommentsのみにdependent: :destroyを付けて、その他を削除する事で削除ができるようになりました。 dependent: :destroyを勘違いしてました。とりあえず付けておけば、関連付いた際に消されるだろうといった認識でしたので、がんじがらめになってしまっているとは、全く想像もしておりませんでした。 ```こいつを消したら意味が無くなるもの に対してのみその方向でのdependent: :destroyをつけるようにしてください``` この一文で一気に解決しました。わかりやすい説明ありがとうございました。
guest

0

@talk_post_room.destroy flash[:success] = 'トークルームを削除しました。' redirect_to user_path(current_user)

となっているので、destroyの成否に関わらず成功メッセージが出ています。
302になるのはredirectさせているのでそうなります。

if @talk_post_room.destroy flash[:success] = 'トークルームを削除しました。' else lash[:success] = '削除に失敗しました。' end redirect_to user_path(current_user)

としてみてください。

それに紐づく usersテーブル、talk_postsテーブル、categoriesテーブル、faboritesテーブルを同時に削除するように、それぞれdependent: :destroyをrbファイルにて付けてあります。

ここに問題がありそうです。
各モデルの関連の定義部分と削除した時のlogを載せてください

投稿2020/02/11 14:16

winterboum

総合スコア23567

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

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

rayi0630

2020/02/11 14:41 編集

elseを追加したところ、削除に失敗しました。と出ました。elseにて定義がなかったので成功メッセージが出ていたのですね。成功してる前提だった事がまず間違いだった事に気づけて良かったです。 関連の定義部分となります。 ・User has_many :talk_posts, dependent: :destroy has_many :talk_post_rooms, dependent: :destroy has_many :categories, dependent: :destroy has_many :favorites, dependent: :destroy ・TalkPost belongs_to :user belongs_to :talk_post_room, dependent: :destroy ・TalkPostRoom belongs_to :user, dependent: :destroy belongs_to :category, dependent: :destroy has_many :talk_posts, dependent: :destroy has_many :favorites, dependent: :destroy has_many :comments, dependent: :destroy ・Favorite belongs_to :user belongs_to :talk_post_room, dependent: :destroy ・Category belongs_to :user has_many :talk_post_rooms, dependent: :destroy ・Comment belongs_to :user belongs_to :talk_post_room, dependent: :destroy 以上です。 ```Processing by TalkPostRoomsController#destroy as HTML Parameters: {"authenticity_token"=>"Ou1YRV5BUF5Hismv3Sbip13/hY+ykn03cePJuT7FxKtgbzzINadwRVcWvtVGMvXQZXyTAnNBEF6zq4b9YOdZyg==", "id"=>"6"} User Load (0.2ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1 ↳ app/helpers/sessions_helper.rb:3 TalkPostRoom Load (0.2ms) SELECT `talk_post_rooms`.* FROM `` WHERE `talk_post_rooms`.`user_id` = 1 AND `talk_post_rooms`.`id` = 6 LIMIT 1 ↳ app/controllers/talk_post_rooms_controller.rb:73 (0.1ms) BEGIN ↳ app/controllers/talk_post_rooms_controller.rb:50 TalkPostRoomPost Load (0.2ms) SELECT `talk_post_rooms_posts`.* FROM `talk_posts` WHERE `talk_posts`.`talk_post_room_id` = 6 ↳ app/controllers/talk_post_rooms_controller.rb:50 TalkPostRoomPost Destroy (0.2ms) DELETE FROM `talk_posts` WHERE `talk_posts`.`id` = 13 talk_post_rooms_controller.rb:50 (2.2ms) ROLLBACK ↳ app/controllers/talk_post_rooms_controller.rb:50 Completed 302 Found in 83ms (ActiveRecord: 5.4ms) ``` rails サーバーに出てるログであってますでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問