Introducción a Ruby on Rails

Capítulo 8. Borrando comentarios

Otra de las funcionalidades básicas de cualquier blog es la posibilidad de borrar los comentarios de spam. Para ello, vamos a añadir un enlace en la vista y una acción llamada destroy en el controlador CommentsController.

En primer lugar, añade el enlace para borrar comentarios en la plantilla del parcial app/views/comments/_comment.html.erb:

<p>
  <strong>Commenter:</strong>
  <%= comment.commenter %>
</p>
 
<p>
  <strong>Comment:</strong>
  <%= comment.body %>
</p>
 
<p>
  <%= link_to 'Destroy Comment', [comment.article, comment],
               method: :delete,
               data: { confirm: 'Are you sure?' } %>
</p>

Al pinchar el enlace "Destroy Comment", se envía una petición HTTP de tipo DELETE a la URL /articles/:article_id/comments/:id que será respondida por CommentsController. Así que vamos a crear la acción destroy en el controlador (archivo app/controllers/comments_controller.rb):

class CommentsController < ApplicationController
  def create
    @article = Article.find(params[:article_id])
    @comment = @article.comments.create(comment_params)
    redirect_to article_path(@article)
  end
 
  def destroy
    @article = Article.find(params[:article_id])
    @comment = @article.comments.find(params[:id])
    @comment.destroy
    redirect_to article_path(@article)
  end
 
  private
    def comment_params
      params.require(:comment).permit(:commenter, :body)
    end
end

La acción destroy busca el artículo que estamos leyendo, localiza el comentario dentro de la colección @article.comments, lo borra de la base de datos y vuelve a mostrar la página con el artículo original.

8.1. Borrando los objetos asociados

Si borras un artículo, todos sus comentarios también derían borrarse para que no ocupen un espacio innecesario en la base de datos. Rails permite configurar este comportamiento mediante la opción dependent de la asociación entre modelos. Para ello, modifica el modelo Article cambiando el contenido del archivo app/models/article.rb por lo siguiente:

class Article < ActiveRecord::Base
  has_many :comments, dependent: :destroy
  validates :title, presence: true,
                    length: { minimum: 5 }
end