Creando una sencilla plataforma de blogs – Editando las 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

Después de haber creado la función de publicar, ahora es el momento de permitir que nuestros usuarios puedan editar sus blogs.

Paso 1:Define la Acción

Empezaremos definiendo la nueva acción en el controlador: 

app/controllers/posts_controller.rb


def edit
    @post = Post.find(params[:id])
end

private

Estamos usandoparams[:id]del mismo modo en que hicimos que las publicaciones aparecieran. Esta vez, sin embargo, queremos asegurarnos de que el propietario del blog es el único que tiene acceso a realizar los cambios en su publicación. 

app/controllers/posts_controller.rb


def edit
   @post = Post.find(params[:id])
   redirect_to posts_path unless @post.user == current_user
end

Paso 2: Crea un nuevo archivo de HTML 

Ahora, podemos crear una página HTML que coincide con el nombre de la acción. Dentro de la carpeta de post,crea un nuevo archivo y llámalo "edit.html.erb". En el nuevo archivo, añade el código de abajo: 

app/views/posts/edit.html.erb


<%= form_for @post do |f| %>
        <%= render 'shared/error_messages', object: f.object %>
        <div class="form-group">
            <%= f.label :title, class: 'control-label' %>
            <%= f.text_field :title, class: 'form-control' %>
        </div>

        <div class="form-group>
            <%= f.label :body, class: 'control-label' %>
            <%= f.text_area :body, class: 'form-control', rows: 6 %>
        </div>

        <%= f.submit 'Save', class: 'btn btn-primary %>
<% end %>

Probablemente has notado, que este formulario esta idéntico al new.html.erb . Con el fin de mantener nuestro código DRY (Don’t Repeat Yourself=no te repitas a ti mismo). Vamos a extraer este formulario  a uno que es parcial y en el cual vamos a poder reproducir en las dos páginas “new” y “edit”. En  app/views/posts/ crea un nuevo archivo y llámalo "_form.html.erb". 

app/views/posts/_form.html.erb


<%= form_for post do |f| %>
        <%= render 'shared/error_messages', object: f.object %>
        <div class="form-group">
            <%= f.label :title, class: 'control-label' %>
            <%= f.text_field :title, class: 'form-control' %>
        </div>

        <div class="form-group>
            <%= f.label :body, class: 'control-label' %>
            <%= f.text_area :body, class: 'form-control', rows: 6 %>
        </div>

        <%= f.submit 'Save', class: 'btn btn-primary' %>
<% end %>

Asegúrate de cambiar "@post" a "post" 

Paso 3: Remplaza el viejo Formulario en los nuevos Archivos 

Ahora, podemos reemplazar el viejo formulario de “new” y “edit” con una sola línea que apunta a la parcial: 

app/views/posts/new.html.erb


<h1>New Post</h1>
<%= render 'form', post: @post %>

app/views/posts/edit.html.erb


<h1>Edit post</h1>
<p><%= link_to 'back', post_path(@post) %></p>
<%= render 'form', post: @post %>

Además, vamos a añadir el enlace para editar la página en la plantilla “show”. En medio del H1 tag, agrega el código desde la línea 3 a la línea 6: 

app/views/posts/show.html.erb


<h1>
        <%= @post.title %>
        <% if @post.user == current_user %>
            <small><%= link_to 'edit', edit_post_path(@post) %></small>
        <% end %>
</h1>
<p><small><strong>By: </strong><%= @post.user.email %></small></p>
<p><%= @post.body %></p>

Podemos agregar este código utilizando una versión más concisa con content_tag. Aunque, creo que podría ser un poco confuso al principio. 

app/views/posts/show.html.erb


<h1><%= @post.title %> <%= content_tag(:small, link_to('edit', edit_post_path(@post))) if @post.user == current_user %></h1>
<p><small><strong>By: </strong><%= @post.user.email %></small></p>
<p><%= @post.body %></p>

Paso 4: Actualiza la acción 

Nuestra función de editar ya casi esta lista. Sin embargo, es incapaz de guardar en la base de datos de todos los cambios que se presenten en el formulario de edit. Para mantener esos cambios vamos a utilizar la acción "Update". 

En el controlador: 

/app/controllers/posts_controller.rb


class PostsController < ApplicationController
# existing code

def update
        @post = Post.find(params[:id])
        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 to this"
        end
end


private
        def allowed_params
            params.require(:post).permit(:title, :body)
        end
end

Como puedes ver, el código es similar a la acción de "create", sin embargo esta vez, tenemos que comprobar si el dueño del puesto es el current_user (usuario actual). Además, en lugar de construir nuevas publicaciones, construiremos uptate_attributes(actualizar los atributos). 

Observa cómo las acciones de crear y actualizar no tienen sus propias plantillas de HTML. Nosotros simplemente redirigimos al usuario después de que realizamos el trabajo.

¡Checa las nuevas funciones!

Deleting posts

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



Comentarios

  • en: nate escribió:

    There is a missing '

    app/views/posts/edit.html.erb

    <%= f.submit 'Save', class: 'btn btn-primary %>

  • en: nate escribió:

    app/views/posts/_form.html.erb is missing "

Comentar

Tú puedes Inicio de sesión Comentar