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 20.11.57.png

スクリーンショット 2020-10-16 11.21.21.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">
<% @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(c.post.id), method: :delete %>
    </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 = Comment.find(params[:id])←ここがエラーになりました
   comment.destroy
   flash[:notice] = "コメントを削除しました"
   redirect_to("/posts/index")
 end

  private

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

11Answer

エラーだけで言うと,id=1の Commentが見つからないようです.

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

こちらを確認すると,cComment だと思うのですが,
c.postPost オブジェクトのように読めました(models/comment.rb より)
ですので,c.post.idPost の id のため,Comment.find しても見つからないのではないでしょうか?

0Like

Comments

  1. @th_9plus

    Questioner

    ということはどのように変更すれば良いでしょうか?
  2. ```ruby:comments_controller.rb
    def destroy
    comment = Comment.find(params[:id])
    comment.destroy
    ```

    とあるので,`params[:id]` には,`Comment` オブジェクトの ID が入ると良さそうです.
  3. @th_9plus

    Questioner

    userかpost だとしたら、どのように変更すればよろしいでしょうか?
  4. すみません.質問の意味がよくわからないです.

    今,コメントを消そうとしているのかと思っています.

    - user
    - post

    は,何に関係するテーマなんでしょうか?
  5. @th_9plus

    Questioner

    すいません。
    今の質問は無視してください。
    CommentのオブジェクトはIDはどうやって見つければ良いですか?
  6. 無視,了解です.

    今消したいコメントは,以下で言うと `c.content` で表示したものかと思います.
    つまり,`c.conent` は `c` の中身(コンテンツ) なので,`c` が消したいコメントだと思います.

    ```ruby:posts/show.html.erb
    <% @comments.each do |c| %>
    <div>
    (省略)
    <%= c.content %>
    <%= link_to "削除", comment_path(c.post.id), method: :delete %>
    ```

    ですので,`comment_path(c.post.id)` とありますが,
    消す対象を渡すべきなのは,`c.post` (コメントに対応する投稿) ではなく,`c` そのものだと思います.

    例えば,`comment_path(c)` 又は,`comment_path(c.id)` でよいかと思います.

    参考
    - https://railsguides.jp/routing.html#%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8B%E3%82%89%E3%83%91%E3%82%B9%E3%82%84url%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B

なるほど!
comment_path(c) 又は,`comment_path(c.id)両方を試して変更したところ同じエラーなりました。

スクリーンショット 2020-10-18 19.22.28.png

0Like

なるほど

ActionController::UrlGenerationError in Posts#show

No route matches {:action=>"destroy", :controller=>"comments", :id=>nil}, missing required keys: [:id]

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

とあるので,UrlGenerationError つまり,comment_path でURL を作成しているときにエラーになっている,
特に id = nil であることが問題のようです.

<%= c.content %>

と同じように,cc.idnil になっているか確認するのはどうでしょうか?

0Like

<%= c.content %>は<%= link_to "削除", comment_path(c.id), method: :delete %>の上の行に書いてありましたが違う箇所に追加すれば良いのでしょうか?
また記入する場合はどこに追加すれば良いでしょうか?
スクリーンショット 2020-10-19 7.54.11.png

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

の中で, c.idnil になっているのではないかと考えたので,
それを確かめるために,c.id の値を c.content でやっているのと同じように,
画面に表示するのはどうか,という提案でした.

ですので,c.content の行は変えずに,

<%= c.id %>

を追加してみて,確認するのはどうでしょうか?

0Like

そうですね.

エラーになってしまうと,c.id が確認できないので,
一旦,以下をコメントアウトしてみるのはどうでしょうか?

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

↓↓↓↓

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

「初めまして 2」 などのように,c.idnil ではないように思います.

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

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

辺りを試してもらえませんか?

0Like

なるほど.難しいですね.

自分でも試してみました.

No route matches {:action=>"destroy", :controller=>"comments", :id=>nil}, missing required keys: [:id]

    <%= c.id %> : <%= c.content %>
    <%= link_to 'aaa', comment_path(nil), method: :delete %>

確かに,comment_pathnil を渡したら同じようなエラーになりますが,
値が入っていればそうはなりませんでした.

<%= c.id %>
<%= link_to '', comment_path(c.id), method: delete %>

この2行の間に,`c.id が 値ありnil になっているのが謎ですね.

一度,問題を切り分けるために,以下を試してみるのはどうでしょうか.
nil でエラーにならないようにしてみました.
これで"削除する" が表示されていない場所が問題の箇所になると思います.

<%= c.id %>
<% if c.present? && c.id.present? %>
  <%= link_to '削除する', comment_path(c), method: :delete %>
<% end %>
0Like

Your answer might help someone💌