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