開発環境
Mac
Ruby 2.6.5
Rails 6.1.3.2
問題が起きたコード
posts_controller.rb
def destroy
@comment=Comment.find_by(params[:id])
@comment.destroy
flash[:notice] = 'コメントを削除しました'
redirect_to("/posts/#{params[:post_id]}")
end
find_byメソッドで返ってくる結果は、最初にヒットした1件なので上のコードのままだとコメントを削除すると古い順から削除されてしまう。
下の記事が参考になりました。
【Rails】コメント削除機能の実装(備忘録)
posts_controller.rb
def destroy
current_user.comments.find(params[:id]).destroy!
flash[:notice] = 'コメントを削除しました'
redirect_to("/posts/#{params[:post_id]}")
end
これでcommentコントローラーのdestroyアクションに、投稿したidを紐づけて削除できるようになります。
posts/show.html.erb
<% @comments.each do |c| %>
<div>
<%= c.content %>
<% if c.user_id == @current_user.id %>
<%= link_to("削除", "/comments/#{c.id}/destroy") %>
<% end %>
<% end %>
</div>
1行目・・要素を一つずつ取得してcに代入する。
4行目、5行目・・コメントしている人のidと今利用している人のidが同じ時に削除できるようにする
config/routes.rb
resources :posts do
resources :comments, only: %i[create destroy]
end
参考記事
【Rails】コメント削除機能の実装(備忘録)
[Rails]コメント削除機能の実装でハマってしまったので一応解決策を。