質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

指定先のコメント削除ができない

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 260

tomtom1

score 19

 前提・実現したいこと

投稿に対し、コメント機能追加しました。
コメントすることは問題ないのですが、コメントを削除する際に、
選んだコメントの削除ボタンを押すと、そのコメントは削除されずに、
一番上のコメント(一番古いコメント)が削除されてしまいます。

おそらく、コメントに対する指定が上手く出来ていないのですが、
自身では未だ解決できずにおり、皆様のお力添えをいただきたく存じます。

 該当のソースコード

  delete "comments/:post_id/destroy" => "comments#destroy"
  resources :users, only: [:index, :show]
  resources :posts, only: [:index, :show, :create] do
  resources :comments, only: [:create, :destroy]
  end
Post Controller
  def show
    @post = Post.find_by(id: params[:id])
    @user = @post.user
    @comments = @post.comments
    @comment = Comment.new
  end
Comment Controller
  def destroy
    @comment = Comment.find_by(params[:id])
    @comment.destroy
    redirect_back(fallback_location: 'something')
  end
show.html.erb
  <% @comments.each do |c| %>
  <div>
  <a href="/users/<%= @post.user.id %>"><%= c.user.name %></a>
  <%=link_to(c.content, "/comments/#{@post.id}/destroy", {method: "delete"})%>
  </div>
  <% end %>


以上です。
お教え頂ければ幸いです。よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

<%=link_to(c.content, "/comments/#{@post.id}/destroy", {method: "delete"})%>
ここが、@post.idではなく、c.idではないでしょうか?

追記
resources :comments, only: [:create, :destroy]
があるので、
delete "comments/:post_id/destroy" => "comments#destroy"
は不要かと思いますがいかがですか?

また、link_toは、
<%= link_to '削除', c, method: :delete %>
でどうでしょうか?

また、
resources :posts, only: [:index, :show, :create] do
resources :comments, only: [:create, :destroy]
end
ブロック記法でresources :commentsを囲っていますが、これは必要ないのでは?と思いました

さらに追記
上記の様なrouteがネストした状態だと、パスは
"/comments/#{@post.id}/destroy"
でなく、
"/posts/comments/#{@post.id}/destroy"
になりませんか?

いずれにしても、
delete "comments/:post_id/destroy" => "comments#destroy"
は不要かと思います

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/14 17:21

    ご返信ありがとうございます!
    それであればしっかり指定できると思い、先ほど変更し挑戦してみましたが、
    結果変わらずに、一番古いコメントから削除されてしまいます。
    (コメントが一つの場合はそのコメントが削除されます)

    また、delete "comments/:post_id/destroy" => "comments#destroy"
    を "comments/:id/destroy" => "comments#destroy"にも変更して挑戦しましたが、
    結果は変わらずでした泣

    キャンセル

  • 2018/11/14 22:02

    resources :comments, only: [:create, :destroy]
    があるので、
    delete "comments/:post_id/destroy" => "comments#destroy"
    は不要かと思いますがいかがですか?

    キャンセル

  • 2018/11/15 14:32

    貴重なお時間ととって、ご指摘頂きありがとうございます!

    Routes:
    delete "comments/:post_id/destroy" => "comments#destroy"
    は不要についてですが、無くすとルートがマッチせずエラーが返ってきてしまいます。

    また、おっしゃる通りルートのパスが違いました。
    "/comments/#{c.id}/destroy”ではなく、/posts/:post_id/comments/:idでした。
    ですが、またそこで/posts/#{post_id}/comments/#{c.id}という風に変更しても、No route matches [DELETE] "/comments/55/destroy"
    と言うエラーが返ってきてしまいます。
    delete "comments/:post_id/destroy”は削除できない現状です。

    View:
    <%= link_to '削除', c, method: :delete %>ですが、
    SyntaxError in PostsController#showと言うエラーが返ってきます。

    また、気になった点がありまして、
    エラーをもらうたびに出てくるRequestParameters:{"id"=>"46”}という記載がした部分にあり、それは削除したいコメントのidではなく、そのコメントしているポストのidです。
    お教え頂いたように、リンクに"/comments/#{c.id}/destroy”と記述していることから、コメントのidを送っていると認識していますが、もしかしたらコメントidをしっかり送れていないのではと気になりました。

    長々と失礼しました。

    キャンセル

  • 2018/11/15 14:53

    link_toのsyntax eroorは僕が間違っていたみたいです
    失礼しました
    いろいろいじった後のコードを再掲載できますでしょうか?

    キャンセル

  • 2018/11/15 15:31

    現状、RoutesとControllerに変更はなく、Viewのhtmlが下記のように変更しています。
    <% @comments.each do |c| %>
    <div>
    <a href="/users/<%= @post.user.id %>"><%= c.user.name %></a>
    <%= c.content %>
    <%=link_to("削除", "/comments/#{c.id}/destroy", {method: "delete"})%>
    <hr></div>
    <% end %>
    結果、現状変わらず、コメント削除を押すと古いコメントの順で削除されてくる状態です。

    キャンセル

  • 2018/11/15 18:11

    routesで、resources :comments はネストさせずに普通に記述すると不都合がありますか?

    キャンセル

  • 2018/11/15 21:38

    度々ありがとうございます。
    はい、残念ながら、NoMethodError in Posts#showというエラーが出てしまいます。
    下記、Viewのhtml内のコメント記入部分の一行目でエラーです。

    <%= form_for [@post, @comment] do |f| %>
    <%= f.text_field :content %>
    <%= f.hidden_field :user_id, :value => @current_user.id %>
    <%= f.hidden_field :post_id, :value => @post.id %>
    <button type="submit" class="btn btn-primary">コメント</button>
    <% end %>

    また、コントローラーでは下記のように定義しています。
    def show
    @post = Post.find_by(id: params[:id])
    @user = @post.user
    @comments = @post.comments
    @comment = Comment.new
    end

    宜しくお願い致します。

    キャンセル

check解決した方法

0

試行錯誤した結果、Post.idの値をしっかりと渡せずにいましたので、
下記のように修正したところ、指定先のコメントの削除に成功しました。

Routes
Rails.application.routes.draw do
resources :posts do
resources :comments
end

Post Controller
def show
@post = Post.find_by(id: params[:id])
@user = @post.user
@comments = @post.comments ←この文を削除
@comment = Comment.new
end

show.html.erb
<% @comments.each do |c| %> ← <% @post.comments.each do |c| %>
<div>
<a href="/users/<%= @post.user.id %>"><%= c.user.name %></a>
<%=link_to(c.content, post_comment_path(@post, c), {method: "delete"})%>
</div>
<% end %>

様々なアドバイスとご協力ありがとうございました!

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る