##コメントの削除機能の作成
Railsで投稿サイトのコメント削除機能を作成した際に、ネストのルーティング関連で少し詰まってしまったのでログを残しておきます。
##作りたいもの
本の内容を投稿(book)して、その投稿1つ1つに対してコメント(book_comment)できる。
そのコメントを消すことができるようにする。
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の書き方が分からず、詰まってしまいました。
comment
はbook
に紐づいているので、comment
を削除(destroy)するときは以下のように引数を2つ指定してあげるといいそうです。
※book_book_comment_path(@book, book_comment)
の部分。
book_comment
となっているのは、@book.book_comments
をeach
で1つ1つ回しているためです。
<% @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つ分かっている状態にすると、きちんと動きました。
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