##今回のテーマは、destroyメソッドが機能しない。
という事で、今回陥った点からまずお話致します。
トークルームにてチャットが出来るアプリにて、マイページでトークルームを削除できない。
という問題点でかなり悩まされる事に。
##テーブル
memo_roomsに関連付けられているのは、
usersテーブル
memo_room_postsテーブル
categoriesテーブル
favoritesテーブル
memo_room_commentsテーブルの5つです。
##解決前までの流れ。
最初にルームが削除出来ないと気付いた時には
@memo_room.destroy
flash[:success] = 'メモルームを削除しました。'
redirect_to user_path(current_user)
end```
コントローラにてこんな感じで書いていました。これにより、失敗しても成功しても削除しました。としか出ず、成功はしてるが、
何故か削除出来ていない。こう勘違いしました。どうしても解けず、質問掲示板にて質問をしました。
```def destroy
if @memo_room.destroy
flash[:success] = 'メモルームを削除しました。'
else
flash[:danger] = '削除に失敗しました。'
redirect_to user_path(current_user)
end
end```
すると・・・成否がどちらでも削除しました。となっているので失敗してるかわからないと、このようにアドバイスを頂き、
アドバイス通りにelseを追加したところ、削除に失敗しました。と表示されました。
成功してると思っていたが、実は失敗していたんですね。それに気づかず成功してる前提で何故消えないかを探していたので
見つかる訳がありません。
##rbファイル dependent: :destroy 間違い編
class MemoRoom < ApplicationRecord
belongs_to :user
belongs_to :category, dependent: :destroy
has_many :memo_room_posts, dependent: :destroy
has_many :favorites, dependent: :destroy
has_many :memo_room_comments, dependent: :destroy
class MemoRoomPost < ApplicationRecord
belongs_to :user
belongs_to :memo_room, dependent: :destroy
has_many :memo_room_posts, dependent: :destroy
has_many :memo_rooms, dependent: :destroy
has_many :categories, dependent: :destroy
has_many :favorites, dependent: :destroy
dependent: :destroyをとりあえず付けておけば削除した際に関連されたデータも消えるから便利程度の認識でした。
ここがまず間違いでこれのせいで、関連付けが多すぎて網目のようになり、ぐちゃぐちゃになってがんじがらめになっていると教えて頂きました。
そして、アドバイスとして一番わかりやすかったのが、
**こいつを消したら意味が無くなるもの に対してのみその方向でのdependent: :destroyをつけるようにしてください**
この時、初めて使い方をきちんと知りました。とてもわかりやすい一言でした。
##解決編
class MemoRoom < ApplicationRecord
belongs_to :user
belongs_to :category
has_many :memo_room_posts, dependent: :destroy
has_many :favorites, dependent: :destroy
has_many :memo_room_comments, dependent: :destroy
memo_roomを消す事により、トークルーム内の投稿であるmemo_room_postsとmemo_roomにいいねされたfavoritesそしてトークルームが消えればコメントも無意味になるのでmemo_room_commentsこの3つのみにdependent: :destroyを付けてみました。
すると、がんじがらめから抜けて綺麗になったのか、削除する事が出来ました。必要のない項目にdependentがダメ!なんて初心者は知らない人もいると思うので、役に立つメモとなればと思います。
知ったかぶり ←しっかりと知識をつけることの大切さを知りました。
https://teratail.com/questions/240800
実際に質問した際のURL。も載せておきます。
以上上手く削除が出来なくなってしまった際のメモでした。参考になればと思います。