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

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

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

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

Q&A

3回答

1262閲覧

Rails 投稿に紐づくコメントが削除できない

ryusei1212

総合スコア0

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

0グッド

0クリップ

投稿2023/03/03 02:42

編集2023/03/03 02:46

実現したいこと

投稿に紐づくコメントを削除したいです。

前提

railsでコメント機能を作成しています。

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

定番のメッセージなのですが

undefined method `destroy!' for nil:NilClass

該当のソースコード

ruby

1 scope module: 'users' do 2 resources :posts, except: %i[index new] do 3 resources :comments, module: :posts, only: %i[create destroy] 4 end 5 end

ruby

1class Users::Posts::ApplicationController < Users::ApplicationController 2 before_action :set_post 3 4 private 5 6 def set_post 7 @post = Post.find(params[:post_id]) 8 end 9end

ruby

1class Users::Posts::CommentsController < Users::Posts::ApplicationController 2 3 def destroy 4 comment = current_user.comments.find_by(id: params[:id]) 5 comment.destroy! 6 redirect_to post_path(@post), alert: 'コメントを削除しました' 7 end 8 9 private 10 11 def comment_params 12 params.require(:comment).permit(:content) 13 end 14end

ruby

1- comments.each do |comment| 2 .card.w-50.mx-auto.my-3 3 .card-header 4 = "#{comment.user.name}さんのコメント" 5 .card-body 6 = comment.content 7 - if comment.user == current_user 8 = link_to post_comment_path(comment), data: { turbo_method: :delete, turbo_confirm: '本当に削除しますか?' }, class: 'text-reset ms-auto' do 9 %i.bi.bi-trash

viewに関してはパーシャルにしているので@commentsではなくcommentsになっています

試したこと

最初はcomment = current_user.comments.find(params[:id])という記述で書いていたのですがこれだとレコードが見つからないというエラーになったので、find_byで試したところcommentがnilになっていて、結局どうすればいいのかわからなくなってしまいました。

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

ruby 3.1.3
Rails 7.0.4

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

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

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

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

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

maisumakun

2023/03/03 03:50

commentはuserとpostのどちらに紐づいているのでしょうか?
ryusei1212

2023/03/03 03:53 編集

記載が漏れていましたが、どちらにも紐づいています。 class Comment < ApplicationRecord belongs_to :user belongs_to :post end
guest

回答3

0

ルートをネストしているため、post と comment は post_comment_path basketbros で指定する必要がある 2 つのパラメーターです。 1 つだけが提供されているため、適切な値は配信されなくなります。 ただし、コメントの内容がすでにわかっている場合は、コメントを削除して記事を不要にすることができます。

投稿2024/02/29 04:04

continuedlodge

総合スコア2

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

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

0

最終的に以下のように実装しました。

ruby

1 resources :posts, except: %i[index new] do 2 resources :comments, module: :posts, only: %i[create update destroy], shallow: true 3 end

ruby

1class Users::Posts::CommentsController < Users::Posts::ApplicationController 2 skip_before_action :set_post, only: :destroy 3 4 def destroy 5 comment = Comment.find(params[:id]) 6 post = comment.post 7 comment.destroy! 8 redirect_to post_path(post), alert: 'コメントを削除しました' 9 end 10end

他にいい方法がありましたらコメントお願いします。

投稿2023/03/03 07:03

ryusei1212

総合スコア0

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

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

0

ルーティングをネストしているので、post_comment_pathには、postcommentの2つを指定する必要があります。1つしか指定していない結果、正しい値が送られなくなっています。

とはいえ、commentがどれかわかれば削除はできますので、postは冗長です。このような場合、ルーティングでshallow: trueと指定すると、commentがすでに存在するshoweditdestroyなどでcomment側のidだけを含んでルーティングを引くようになります。

投稿2023/03/03 03:57

maisumakun

総合スコア145225

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

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

ryusei1212

2023/03/03 04:18

コメントありがとうございます。 > postとcommentの2つを指定する必要があります。1つしか指定していない結果、正しい値が送られなくなっています。 comment = @post.comments.find_by(id: params[:id]) 上記記述でも同じ様にエラーが起こるのですが、投稿に紐づくコメントの中から、pramasで受け取ったidをもとにコメントを特定して削除するというのなぜできないのかが、腑に落ちていません。
ryusei1212

2023/03/03 04:33

すいません、わすれてください。解決できそうです。
ryusei1212

2023/03/03 07:04

maisumakunさんありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問