LoginSignup
7
7

More than 3 years have passed since last update.

[Rails]ネストしたコメントの削除機能の作成

Posted at

コメントの削除機能の作成

Railsで投稿サイトのコメント削除機能を作成した際に、ネストのルーティング関連で少し詰まってしまったのでログを残しておきます。

作りたいもの

本の内容を投稿(book)して、その投稿1つ1つに対してコメント(book_comment)できる。
そのコメントを消すことができるようにする。

routes.rb
Rails.application.routes.draw do
  devise_for :users
  resources :users,only: [:show,:index,:edit,:update]
  resources :books do
    resources :book_comments, only: [:create, :destroy]
  end

  root 'home#top'
  get 'home/about'
end

destroyアクションにlink_toする書き方について

ここで、viewファイルのlink_toの書き方が分からず、詰まってしまいました。

commentbookに紐づいているので、commentを削除(destroy)するときは以下のように引数を2つ指定してあげるといいそうです。

book_book_comment_path(@book, book_comment)の部分。

book_comment となっているのは、@book.book_commentseachで1つ1つ回しているためです。

show.html
<% @book.book_comments.each do |book_comment| %>
    <%= link_to  "#{book_comment.user.name}", user_path(book_comment.user) %>
        <span><%= book_comment.created_at.strftime('%Y/%m/%d') %></span>
    <%= link_to "Destroy", book_book_comment_path(@book, book_comment), method: :delete, data:{confirm: "削除しますか?"}, class: "btn-sm btn-danger"%>
    <div class="comment-entry"><%= book_comment.comment %></div>
<% end %>

コントローラーファイルについて

コントローラーファイルは以下の通りです。

URLにはidが2つある状態(/books/:book_id/book_comments/:id(.:format))なので、book_idとコメントのidが2つ分かっている状態にすると、きちんと動きました。

book_comments_controller.rb
class BookCommentsController < ApplicationController
    before_action :authenticate_user!
    def create
        @book = Book.find(params[:book_id])
        @book_new = Book.new
        @book_comment = @book.book_comments.new(book_comment_params)
        @book_comment.user_id = current_user.id
        @book_comment.save
        redirect_to book_path(@book)
    end
    def destroy
        @book = Book.find(params[:book_id])
        book_comment = @book.book_comments.find(params[:id])
        if book_comment.user != current_user
            redirect_to request.referer
        end
        book_comment.destroy
        redirect_to request.referer
    end

    private
    def book_comment_params
        params.require(:book_comment).permit(:comment)
    end
end

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7