🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

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

Ruby on Rails

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

Q&A

解決済

1回答

1001閲覧

グループの退出時にいいね!を全て消したい【Rails】

tomtom1

総合スコア168

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2021/01/15 16:59

###実現したい事
参加したグループ内のPostにしたいいね!を、グループ退出時に全て消したいです。

以下、退出時の処理ですが、エラーが出てしまいます。

controller

1def exit 2 @group = Group.find_by(id: params[:id]) 3 @posts = @group.group_posts 4 @posts.each do |post| 5 @like = Like.find_by(user_id: @current_user.id, post_id: post.id) 6 @like.destroy 7 end 8 @group.users.delete(@current_user) 9 flash[:notice] = "退出しました" 10 redirect_to("/") 11 end

Error

1undefined method `destroy' for nil:NilClass

schema

1 create_table "group_posts", force: :cascade do |t| 2 t.integer "group_id" 3 t.integer "post_id" 4 t.datetime "created_at", null: false 5 t.datetime "updated_at", null: false 6 t.index ["group_id"], name: "index_group_posts_on_group_id" 7 t.index ["post_id"], name: "index_group_posts_on_post_id" 8 end 9 10 create_table "group_users", force: :cascade do |t| 11 t.integer "group_id" 12 t.integer "user_id" 13 t.datetime "created_at", null: false 14 t.datetime "updated_at", null: false 15 t.index ["group_id"], name: "index_group_users_on_group_id" 16 t.index ["user_id"], name: "index_group_users_on_user_id" 17 end 18 19 create_table "groups", force: :cascade do |t| 20 t.string "name" 21 t.integer "user_id" 22 t.text "content" 23 t.datetime "created_at", null: false 24 t.datetime "updated_at", null: false 25 end 26 27 create_table "likes", force: :cascade do |t| 28 t.integer "user_id" 29 t.integer "post_id" 30 t.datetime "created_at", null: false 31 t.datetime "updated_at", null: false 32 end

お分かりの方、ぜひアドバイス宜しくお願い致します。

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

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

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

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

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

m.ts10806

2021/01/16 01:36

設計を聞きたいです。 「グループ退出」はどこまでの対応になるのでしょうか。 ユーザー自体が消されるわけではないのでしたら、残しておいても良いようには思います。 「実績管理をどこまでするか」ですね。
tomtom1

2021/01/16 10:18

ありがとうございます! @group.users.delete(@current_user)の処理でグループから退出という処理は出来ております。 しかし、その上のコードで、グループ内のPostを取得し、自分がPostにいいね!をしていれば、いいね!したLikeを全て削除したいのです。 現在の進捗は、winterboumさんの回答欄にあります。どうぞ宜しくお願いします。
guest

回答1

0

ベストアンサー

一つもいいねしていないpostがあるときのエラーですね。

@posts.each do |post| @like = Like.find_by(user_id: @current_user.id, post_id: post.id) @like.destroy end

@posts.each do |post| Like.where(user_id: @current_user.id, post_id: post.id).destroy_all end

としてください

Like.where(user_id: @current_user.id, post_id: @posts.map(&:id)).destroy_all

でも良いかな。

投稿2021/01/16 01:10

winterboum

総合スコア23567

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

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

tomtom1

2021/01/16 10:10

ご回答いただき、ありがとうございます! 「一つもいいねしていないpostがあるときのエラーですね。」 →当時のfind_byで処理するのであればif @current_user.like?(post)で囲ってあげれば良かったのですね! お教え頂いたご回答は2つとも、エラーがなくなりましたが、いいね!を消す事が叶いませんでした。 groups/show(退出ボタンがあるページ)にて、@posts = @group.group_postsでグループ所属Postを一覧できているため、今回の処理コードでも@postsをしっかり取得出来ているとは思うのですが..。 何か他に試すべき事などございましたらお教え頂ければ幸いです。
winterboum

2021/01/16 11:11

@posts = @group.group_posts でなく @posts = @group.posts ですね
winterboum

2021/01/16 11:13

もしくは post_id: @posts.map(&:post_id)) @posts とあるので Postだと読んでしまいます。 @group.group_posts なら @group_posts とすべき
tomtom1

2021/01/16 16:00

無事解決しました!大変勉強になりました!ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問