Introducción a Rails

Actualizando artículos

Hemos cubierto la parte "CR" del acrónimo CRUD. Ahora nos enfocaremos en la parte "U", actualización de artículos.

El primer paso será agregar la acción edit al posts_controller.

Empecemos agregando una ruta a config/routes.rb:

get "posts/:id/edit" => "posts#edit"

Y luego agregar la acción al controlador:

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

La vista contendrá un formulario similar al que usamos cuando creamos nuevos artículos. Crea un archivo llamado app/views/posts/edit.html.erb que contenga lo siguiente:

<h1>Editing post</h1>

<%= form_for :post, :url => { :action => :update, :id => @post.id },
:method => :put do |f| %>
  <% if @post.errors.any? %>
  <div id="errorExplanation">
    <h2><%= pluralize(@post.errors.count, "error") %> prohibited
      this post from being saved:</h2>
    <ul>
    <% @post.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
    </ul>
  </div>
  <% end %>
  <p>
    <%= f.label :title %><br>
    <%= f.text_field :title %>
  </p>

  <p>
    <%= f.label :text %><br>
    <%= f.text_area :text %>
  </p>

  <p>
    <%= f.submit %>
  </p>
<% end %>

<%= link_to 'Back', :action => :index %>

Esta vez indicamos al formulario la acción update, la cual no está definido aún pero pronto lo estará.

La opción :method => :put le dice a Rails que queremos que este formulario sea enviado a través del método HTTP PUT, el cual es el método que tú esperas que se use para actualizar recursos de acuerdo al protocolo REST.

CONSEJO: Por omisión los formularios construidos con el asistente +form_for_ son enviados a través de POST.

A continuación, necesitamos agregar la acción update. El archivo config/routes.rb necesitará una línea más:

put "posts/:id" => "posts#update"

Y luego crear la acción update en app/controllers/posts_controller.rb:

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

  if @post.update_attributes(params[:post])
    redirect_to :action => :show, :id => @post.id
  else
    render 'edit'
  end
end

El nuevo método update_attributes, es usado cuando deseas actualizar un registro que ya existe, y acepta un hash conteniendo los atributos que deseas actualizar. Como hicimos anteriormente, si hay un error actualizando el artículo queremos mostrar el formulario de regreso al usuario.

CONSEJO: no necesitas enviar todos los atributos a update_attributes. Por ejemplo, si llamas a @post.update_attributes(:title => 'A new title') Rails solo actualizará el atributo title sin tocar los otros atributos.

Finalmente, queremos mostrar un enlace a la acción edit en la lista de todos los artículos, de esta manera hacemos que ahora en app/views/posts/index.html.erb aparezca un nuevo enlace adicional a la acción show:

<table>
  <tr>
    <th>Title</th>
    <th>Text</th>
    <th></th>
    <th></th>
  </tr>

<% @posts.each do |post| %>
  <tr>
    <td><%= post.title %></td>
    <td><%= post.text %></td>
    <td><%= link_to 'Show', :action => :show, :id => post.id %></td>
    <td><%= link_to 'Edit', :action => :edit, :id => post.id %></td>
  </tr>
<% end %>
</table>

Y también la agregaremos en la plantilla app/views/posts/show.html.erb de manera que haya un enlace "Edit" en la página del artículo. Agregar esto al final de tu plantilla:

...

<%= link_to 'Back', :action => :index %>
| <%= link_to 'Edit', :action => :edit, :id => @post.id %>

Y así es cómo nuestra aplicación se ve hasta el momento

Index action with edit link