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 controladorCommentsController
.
En primer lugar, añade el enlace para borrar comentarios en la plantilla del parcialapp/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.
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óndependent
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