Проблемы с реализацией Destroy в полиморфных комментариях Rails, ActiveRecord

Я создаю приложение Rails с некоторыми полиморфными отношениями, которые работают, однако у меня возникают проблемы с реализацией действия уничтожения. Таблица комментариев — это полиморфная таблица, Тема has_many :comments и профиль has_many :comments. В данный момент я борюсь с возможностью удалять комментарии со страницы тематического шоу (в основном это форум). Я создал edit_comment_path и могу успешно редактировать и обновлять комментарии через контроллер комментариев, однако, когда я пытаюсь удалить, @comment = Comment.find(params[:id]) он продолжает искать Subject.id вместо Comment.id? Ссылка для удаления кажется правильной, поэтому я немного озадачен. Пожалуйста, смотрите код ниже. Любые предложения или уточнения также будут приняты с благодарностью!

просмотры/комментарии/_comment.html.erb

<% commentable.comments.each do |comment| %>
  <div>
    <hr>
    <% if commentable == @subject %>
      <p><%= comment.body %>  |  Posted by <%= comment.user.email %>, <%= time_ago_in_words(comment.created_at) + ' ago' %></p>

      <% if comment.user == current_user %>
        <%= link_to "Edit", edit_comment_path(comment, subject: 'subject') %>
        <%= link_to "Delete", comment_path, method: :delete %>
      <% end %>
    <% else %>
      <p><<%= comment.title %></p>
      <p><%= comment.body %> </p>
    <% end %>
  </div>
<% end %>

comments_controller.rb

class CommentsController < ApplicationController

  def show
    @comment = Comment.find(params[:id])
  end

  def create
    @comment = @commentable.comments.new(comment_params)
    @comment.user_id = current_user.id
    if @comment.save
      redirect_to @commentable, notice: "Successfully Posted!"
    end
  end

  def edit
    @comment = Comment.find(params[:id])
  end

  def update
    @comment = Comment.find(params[:id])
    if @comment.update(comment_params)
      redirect_to @comment.commentable, notice: "Comment was updated."
    end
  end

  def destroy
    @comment = Comment.find(params[:id])
  end

  private
  def comment_params
    params.require(:comment).permit(:title, :body)
  end
end

просмотры/темы/show.html.erb

<h1><%= @subject.title %></h1>
<p>Created by: <%= @subject.user.email %>, <%= time_ago_in_words(@subject.created_at) + ' ago' %></p>


<%= render partial: 'comments/comment', locals: {commentable: @subject} %>
<%= render partial: 'comments/form', locals: {commentable: @subject} %>

config/routes.rb

Rails.application.routes.draw do
  resources :locations, only: [:show, :destroy, :edit, :update]
  resources :comments, only: [:show, :edit, :update, :destroy]

  resources :subjects, only: [:index, :show] do
    resources :comments, module: :subjects
  end
  resources :profiles do
    resources :subjects, module: :profiles
    resources :locations, module: :profiles
    resources :comments, module: :profiles
  end
  resource :session, only: [:new, :create, :destroy]
  resources :users, only: [:new, :create, :show]
  root "home#index"

end

Любая обратная связь будет принята с благодарностью


person RuNpiXelruN    schedule 14.06.2016    source источник


Ответы (1)


На беглый взгляд похоже

<%= link_to "Delete", comment_path, method: :delete %>

должно быть:

<%= link_to "Delete", comment_path(comment), method: :delete %>

Я предполагаю, что проблема в том, что params[:id], передаваемый вашим комментариям#destroy, является идентификатором темы, а не идентификатором комментария.

Кроме того, ваш метод уничтожения должен выглядеть примерно так:

def destroy
    comment = Comment.find(params[:id])
    comment.destroy
    redirect_to somewhere
end
person sbjluke    schedule 14.06.2016
comment
Угу, спасибо @sbjluke, вот и все. Так просто, но я слишком долго смотрел на это и не мог этого увидеть. Еще раз спасибо - person RuNpiXelruN; 14.06.2016