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