Creando una Sencilla Plataforma de Blogs - Eliminando Publicaciones

Por:, en:

ES:This tutorial assumes you have already completed:

  1. Install Ruby on Rails
  2. Create Ruby on Rails application
  3. Create Static Pages - without this deploy will not work
  4. Install Git
  5. Create Remote Git Repository - optional but recommended
  6. Deploy application to Heroku
  7. Manage users with Devise
  8. How to add Twitter Bootstrap to Ruby on Rails application - Advised
  9. Creating Simple Blogging Platform - Creating Model
  10. Creating Simple Blogging Platform - Routes
  11. Creating Simple Blogging Platform - Displaying Posts
  12. Creating Simple Blogging Platform - Building Posts
  13. 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
 

Si tu Inicio de sesión serás capaz de marcar esto tutorial Como vas avanzando tu progreso



Comentar

Tú puedes Inicio de sesión Comentar