Creando una Sencilla Plataforma de Blogs - Eliminando Publicaciones
Por: Lukasz Muzyka, en:
ES:This tutorial assumes you have already completed:
- Install Ruby on Rails
- Create Ruby on Rails application
- Create Static Pages - without this deploy will not work
- Install Git
- Create Remote Git Repository - optional but recommended
- Deploy application to Heroku
- Manage users with Devise
- How to add Twitter Bootstrap to Ruby on Rails application - Advised
- Creating Simple Blogging Platform - Creating Model
- Creating Simple Blogging Platform - Routes
- Creating Simple Blogging Platform - Displaying Posts
- Creating Simple Blogging Platform - Building Posts
- Creating Simple Blogging Platform - Editing Posts
Una última cosa que queremos que los usuarios puedan hacer es borrar las entradas que no quieren. Afortunadamente, dado todo el trabajo que ya hemos hecho, esta será una tarea fácil.
Paso 1: Crea una acción en el controlador
Igual que antes, vamos a empezar por crear la acción en el controlador:
/app/controllers/posts_controller.rb
class PostsController < ApplicationController
# existing code
def destroy
@post = Post.find(params[:id])
if @post.user == current_user
@post.destroy
redirect_to posts_path
else
redirect_to root_path
flash[:danger] = "You can't do this"
end
end
private
def allowed_params
params.require(:post).permit(:title, :body)
end
end
Al igual que como lo hicimos antes, tendremos que encontrar la publicación en la base de datos. Usaremos :id
de la URL con el fin de realizar la búsqueda. A continuación, vamos a comprobar si la publicación pertenece al usuario que quiere eliminarlo. Si no, lo vamos a redirigir a la página de inicio y mostrara un mensaje de error, de lo contrario, vamos a eliminar el registro y llevar al usuario a la lista de todas las publicaciones.
Paso 2: Añade el enlace
Ahora, tenemos que crear un enlace que puede desencadenar la acción de eliminación. El usuario probablemente espera "eliminar" el enlace que está en la página de “edit”:
app/views/posts/edit.html.erb
<h1>Edit post</h1>
<p><%= link_to 'back', post_path(@post) %></p>
<%= render 'form', post: @post %>
<br />
<p><%= link_to 'delete post', @post, method: :delete, data: {confirm: "Are you sure you want to delete this permanently?"} %></p>
Paso 3: Un poco de refactorización
Cuando miramos a nuestro controlador podemos notar fácilmente, que hay algo de código repetible en él. Vamos a re-factorizar un poco.
En primer lugar, vamos a extraer la búsqueda de correos con params [: id] y ejecutarlo como filtro para aquellas acciones que lo utilizan:
/app/controllers/posts_controller.rb
class PostsController < ApplicationController
before_filter :authenticate_user!, except: [:index, :show]
before_filter :find_post, only: [:show, :edit, :update, :destroy]
def index
@posts = Post.all
end
def show
# @post = Post.find(params[:id])## NOT NEEDED ANYMORE MOVED TO BEFORE FILTER
end
def new
@post = Post.new
end
def create
@user = current_user
@post = @user.posts.build(allowed_params)
if @post.save
flash[:success] = "Created new post"
redirect_to @post
else
render 'new'
end
end
def edit
# @post = Post.find(params[:id])## NOT NEEDED ANYMORE MOVED TO BEFORE FILTER
redirect_to posts_path unless @post.user == current_user
end
def update
# @post = Post.find(params[:id])## NOT NEEDED ANYMORE MOVED TO BEFORE FILTER
if @post.user == current_user
if @post.update_attributes(allowed_params)
flash[:success] = "Updated post"
redirect_to @post
else
render 'edit'
end
else
redirect_to posts_path
flash[:notice] = "You can't do this"
end
end
def destroy
# @post = Post.find(params[:id])## NOT NEEDED ANYMORE MOVED TO BEFORE FILTER
if @post.user == current_user
@post.destroy
redirect_to posts_path
flash[:success] = "deleted post"
else
redirect_to root_path
flash[:danger] = "You can't do this"
end
end
private
def allowed_params
params.require(:post).permit(:title, :body)
end
def find_post
@post = Post.find(params[:id])
end
end
Podríamos hacer un poco más, pero por ahora es suficiente. La versión final del controlador se verá así:
/app/controllers/posts_controller.rb
class PostsController < ApplicationController
before_filter :authenticate_user!, except: [:index, :show]
before_filter :find_post, only: [:show, :edit, :update, :destroy]
def index
@posts = Post.all
end
def show
end
def new
@post = Post.new
end
def create
@user = current_user
@post = @user.posts.build(allowed_params)
if @post.save
flash[:success] = "Created new post"
redirect_to @post
else
render 'new'
end
end
def edit
redirect_to posts_path unless @post.user == current_user
end
def update
if @post.user == current_user
if @post.update_attributes(allowed_params)
flash[:success] = "Updated post"
redirect_to @post
else
render 'edit'
end
else
redirect_to posts_path
flash[:notice] = "You can't do this"
end
end
def destroy
if @post.user == current_user
@post.destroy
redirect_to posts_path
flash[:success] = "deleted post"
else
redirect_to root_path
flash[:danger] = "You can't do this"
end
end
private
def allowed_params
params.require(:post).permit(:title, :body)
end
def find_post
@post = Post.find(params[:id])
end
end
Comentar
Tú puedes Inicio de sesión Comentar