acciones custom en Rails 3 (Parte 1 borrar multiples registros)

Muchas veces necesitamos tener o realizar operaciones especiales mas allá del CRUD (Create, Read, Update and Delete) para nuestros modelos, como por ejemplo poder elimiar varios registros a la vez o editar varios registros, etc.

Estuve buscando en varios sitios como poder realizar esto, yo tenia precisamente la problematica de necesitar borrar y editar varios registros en vez de uno a la vez, por ello aqui describo los pasos que realizé para lograr mi cometido.

Primero hay que editar el archivo routes.rb
Aqui hay que crear nuestras rutas a las acciones que queremos realizar, en mi caso mi controlador de usuarios está anidado en el controlador de administrador, entonces necesitamos nuestras rutas REST para el CRUD basico y aparte nuestras acciones custom para borrar y editar varios registros, para ello describimos nuestras rutas custom dentro del bloque collection de esta manera Rails interpreta dichas rutas para manipular varios registros, así pues quedaría de la siguiente manera:

    
namespace :admin do |admin|
resources :users do
collection do
post :delete_many, :as => :delete
end
end
end

Ahora toca agregar las acciones en el controlador, para ello edito mi archivo users_controller.rb quedando así:

    
def delete_many
if !(params[:users_ids] == nil)
params[:users_ids].each do |id|
User.delete_all(["id = ?" , id.to_i])
end
flash[:notice] = "Users deleted successfully."
redirect_to admin_users_path
end
end

Y por ultimo editamos el archivo index.html.erb (la vista donde se muestran los usuarios:

    



Users catalog


<% if @users.blank? %>



The are no users yet!


<% else %>
<%= form_tag delete_admin_users_path do %>
<%= submit_tag 'Delete Selected', :confirm => 'Are you sure?' %>

<% @users.each do |user| %>

<% end %>






















Selected Username Name Last name Email Role Status
<%= check_box_tag "users_ids[]", user.id %> <%= user.username %> <%= user.name %> <%= user.last_name %> <%= user.email %> <%= @roles[user.role] %> <%= @status_desc[user.status.to_sym] %> <%= link_to 'Edit', edit_admin_user_path(user) %> <%= link_to 'Delete', admin_user_path(user), :method => :delete,
:confirm => 'Are you sure?' %>

<% end %>
<% end %>


<%= link_to 'New User', new_admin_user_path %>

Aqui destacan varias cosas, primero, estoy usando el helper form_tag en vez de form_for porque no estoy enfocando este formulario a un modelo en particular, o dicho de otra manera este formulario no realiza operaciones CRUD, solo despliega datos, así mismo estoy usando la magia de rails para encontrar la ruta de mi controlador#acción al llamar a delete_admin_users_path, si quieres ver como utilizar las rutas basta con correr “rake routes” en una consola para ver las rutas que rails ha generado y basta con agregarles el prefijo _path para que detecte a que ruta estás apuntando, segundo, para poder tener selección multiple estoy usando el helper check_box_tag cuyo nombre del componente es “user_ids[]” y se declara así porque de esta forma rails detecta los registros seleccionados y los envia al controlador como un arreglo, por ello yo itero dicho arreglo en la acción del controlador.

Bueno por lo pronto es todo, esperen la segunda y ultima parte de este post donde describo como editar varios registros a la vez, cabe señalar que estoy aprendiendo a programar en ruby y rails mientras desarrollo esta aplicación, proximamente pondré la ruta de donde puedes descargar el código fuente de mi proyecto, pues está liberado bajo licencia AGPL v3 🙂 Hasta pronto!

One thought on “acciones custom en Rails 3 (Parte 1 borrar multiples registros)

Leave a Reply

Your email address will not be published. Required fields are marked *