7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?