th_9plus
@th_9plus (たかちゃん)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

ruby on rails コメント一覧でコメントが削除できない

エラー文は出ていませんがコメントが削除できないのと
画像のように削除がたくさん出てきます。改善の仕方が分からないので教えて頂きたいです。
スクリーンショット 2020-10-16 9.26.39.png

routes.rb
Rails.application.routes.draw do

  devise_for :users
  get "login" => "users#login_form"


  post "login" => "users#login"
  post "logout" => "users#logout"


  post "users/:id/update" => "users#update"
  get "users/:id/edit" => "users#edit"
  post "users/create" => "users#create"
  get "singnup" => "users#new"
  get "users/index" => "users#index"
  get "users/:id" => "users#show", as: :user

  get "posts/index" => "posts#index"
  get "posts/new" => "posts#new"
  get "posts/:id" => "posts#show", as: :post

  resources :comments, only: [:create,:destroy]


  post "posts/create" => "posts#create"

  get "posts/:id/edit" => "posts#edit"

  post "posts/:id/update" => "posts#update"
  post "posts/:id/destroy" => "posts#destroy"
  get "/" => "home#top"
  get "about" => "home#about"

end
posts/show.html.erb
<div class="main posts-show">
  <div class="container">
    <div class="posts-show-item">
      <div class="post-user-name">
        <img src="<%= "/user_images/#{@user.image_name}" %>">

        <%= link_to(@user.name, "/users/#{@user.id}") %>

      </div>

      <p>
        <%= @post.content %>
      </p>

      <div class="post-time">
       <%= @post.created_at %>
       </div>
       <% if @post.user_id == @current_user.id %>
       <div class="post-menus">
        <%= link_to("編集", "/posts/#{@post.id}/edit") %>
        <%= link_to("削除", "/posts/#{@post.id}/destroy", {method: "post"}) %>
      </div>
      <% end %>

<div class="comment-wrapper border-top mb-10">
  <p class="mt-5">コメント一覧</p>
  <% @comments.each do |c| %>
    <div>
      <% unless c.user.blank? %>

        <img src="<%= "/user_images/#{c.user.image_name}" %>">
      <% end %>
      <%= c.user.name unless c.user.blank? %>
      <br />
      <%= c.content %>
      <% @comments.each do |comment| %>

  <%=link_to "削除", comment_path(comment.post.id), method: :delete %>
<% end %>
    </div>
    <br />
  <% end %>
  <% if user_signed_in? %>
    <%= form_with(model: @comment, url: comments_path, method: :post, local: true) do |f| %>
    <%= hidden_field_tag :post_id, @post.id %>
      <%= f.text_area :content, class: "form-control", rows: 5 %>
      <%= button_tag type: "submit", class: "btn btn-success float-right mt-1" do %>
        <i class="far fa-comments"></i> コメントする
      <% end %>
    <% end %>
  <% end %>
</div>
    </div>

  </div>

</div>
models/comment.rb
class Comment < ApplicationRecord
  belongs_to :user
  belongs_to :post
end
comments.controller.rb
class CommentsController < ApplicationController

   before_action :authenticate_user

  def create
    logger.debug "*"*100
    logger.debug "[comments_controller.rb]"
    logger.debug "*"*100
    post = Post.find(params[:post_id])
    @comment = post.comments.build(comment_params)
    @comment.user_id = current_user.id
    if @comment.save
      logger.debug "saved"
      flash[:notice] = "コメントしました"
      redirect_to(post)
    else
      logger.debug "failed"
      flash[:notice] = "コメントできませんでした"
      redirect_to(post)
    end
  end

  def destroy
    Comment.find_by(id: params[:id])
    flash[:notice] = "コメントを削除しました"
   redirect_to("/posts/index")
 end

  private

    def comment_params
      params.require(:comment).permit(:content)
    end
  logger.debug "*"*100
end
0

5Answer

<% @comments.each do |c| %>と書いていて、@comments配列のそれぞれの要素をcとして使うと宣言しているので

<%=link_to "削除", comment_path(c.post.id), method: :delete %>

として見てください

1Like

Comments

  1. @th_9plus

    Questioner

    できました!
    ありがとうございます!!

削除できないのは後続の偉い人に答えていただくとして、まず削除がいっぱい並ぶ理由は以下の文のタグがごちゃごちゃなのでendタグを意識して整理して見てください。

おそらくcommentsの数だけ削除が表示されていると思います。

  <% @comments.each do |c| %>
    <div>
      <% unless c.user.blank? %>

        <img src="<%= "/user_images/#{c.user.image_name}" %>">
      <% end %>
      <%= c.user.name unless c.user.blank? %>
      <br />
      <%= c.content %>
      <% @comments.each do |comment| %>

  <%=link_to "削除", comment_path(comment.post.id), method: :delete %>
<% end %>
    </div>
0Like

Comments

  1. @th_9plus

    Questioner

    どこに何を加えれば良いでしょうか?
  2. 削除ボタンに対して`comments.each`でループさせていたのでループは不要だと思います。

    ```
    <% @comments.each do |c| %>
    <div>
    <% unless c.user.blank? %>
    <img src="<%= "/user_images/#{c.user.image_name}" %>">
    <% end %>
    <%= c.user.name unless c.user.blank? %>
    <br />
    <%= c.content %>
    <%=link_to "削除", comment_path(comment.post.id), method: :delete %>
    </div>
    <br />
    <% end %>
    ```
<% @comments.each do |c| %>

のように,each のループ変数で c を宣言しているが,
実際に使っているのは,

<%= link_to "削除", comment_path(comment.post.id), method: delete %>

のように,comment にしてしまっている所為かと思います.

0Like

変更したところ、このエラーが出ました。

commentが定義されていませんというエラーです。
eachで回して取り出している変数はcommentですか?それとも他の変数ですか?
cという変数ですね。
そのため、以下となるのが正しいのではないかと考えられます。

<%= link_to "削除", comment_path(c.post.id), method: delete %>

かなり基礎的な部分なので、
もう一度使っている教材などを見直されてはいかがでしょうか?

0Like

Your answer might help someone💌