Ver Mensaje Individual
  #3 (permalink)  
Antiguo 19/04/2012, 20:31
Avatar de jhsilva
jhsilva
 
Fecha de Ingreso: mayo-2009
Mensajes: 85
Antigüedad: 15 años, 5 meses
Puntos: 5
Respuesta: Combos dependiente en Ruby

Cita:
Iniciado por patricia:) Ver Mensaje
Por favort alguien que me pueda ayudar =(
Lo que debes realizar es el uso de UJS. De forma resumida utilizaré una implementación que yo realicé de algo similar y espero te sirva.

Esto es basado en un controlador llamado traslasdos_internos_controller.rb que permitia gestionar los traslados internos dentro de un cementerio. El tema que tenia 2 select y en base a la selección de el lugar de inicio debía cargar otro select (lugar destino) con las otras sepulturas sepulturas menos la que habia sido seleccionada en el lugar de inicio


1) En el _form.html.erb al cambiar la selección del lugar de inicio enviamos una petición mediante ajax al controlador quien la procesará y responderá a ella mediante js.

Código ruby:
Ver original
  1. <div class="span-12">
  2.   <%= f.label :'lugar Inicio' %><br />
  3.   <%= f.collection_select :lugar_inicio, Sepultura.all, :id, :cod_sepultura, {:include_blank => 'Lugar actual'}, {:class => 'selector_title'} %>
  4.  
  5. </div>
  6.  
  7. <div class="span-5">
  8.   <%= f.label :'Lugar Destino' %><span class="red">*</span><br />
  9.   <%=f.select(:lugar_destino, Sepultura.all.collect {|p| [ p.cod_sepultura ,p.id ] }, {:prompt => 'Lugar destino'},:class => "selector_title")%>
  10. </div>

Ahora el codigo javascript que manipula la petición de acuerdo a la selección del select de lugar de inicio.

Código Javascript:
Ver original
  1. jQuery(document).ready(function() {
  2.     jQuery('#traslado_interno_lugar_inicio').html("<option value=' '>Lugar actual</option>");
  3.     jQuery('#traslado_interno_difunto_id').change(function() {
  4.  
  5.         var data = $('#traslado_interno_difunto_id').val();
  6.         //alert(data);
  7.         $.ajax({
  8.             type: "POST",
  9.             url: "dynamic_sepulturas/"+data,
  10.             data: data,
  11.  
  12.             beforeSend: function()
  13.             {
  14.                $('#status').html('<img src="loading.gif">');
  15.             },
  16.             success: function(response)
  17.             {
  18.        
  19.             }
  20.         });
  21.     });
  22. });


2) Agregamos la ruta que recibirá mediante GET el id de la sepultura para consultar en el controlador al modelo

routes.rb

Código ruby:
Ver original
  1. match 'dynamic_sepulturas/:id', :controller=>'traslado_internos', :action => 'dynamic_sepulturas'


3) Ahora en el controlador manejamos la petición en su respectiv acción obteniendo el parametro enviado (:id)

Código ruby:
Ver original
  1. #Actualiza select en formulario de traslados internos
  2.   def dynamic_sepulturas
  3.     @difunto = Difunto.find(params[:id]) unless params[:id].blank?
  4.     @sepultura = @difunto.sepultura(:first)
  5.     @sepultura_nueva = Sepultura.where("cod_sepultura<>?",@sepultura.cod_sepultura)
  6.  
  7.   respond_to do |format|
  8.       format.js
  9.     end
  10.   end

Lo relevante del codigo anterior es que respondimos en format.js . Entonces en nuestras views del controlador debemos crear una view con el nombre de la acción pero como .js.erb. En este caso se llamaría.

dynamic_sepulturas.js.erb

Ahora procedemos a cargar el select dependiente.

Código Javascript:
Ver original
  1. $('#traslado_interno_lugar_destino').empty();
  2. <% for sepultura in @sepultura_nueva %>
  3.  
  4.       $('#traslado_interno_lugar_destino').append($("<option></option>").attr("value",<%= sepultura.id %>).text('<%= sepultura.cod_sepultura %>'));
  5. <% end %>
  6.  
  7. $('#traslado_interno_lugar_inicio').empty();
  8.  
  9.       $('#traslado_interno_lugar_inicio').append($("<option></option>").attr("value",<%= @sepultura.id %>).text('<%= @sepultura.cod_sepultura %>'));


Espero os sirva. He implementado varias veces algo parecido y me ha ido bien.

Saludos cordiales
__________________
Estudiante de Ingenieria Civil en Informática, soñador, apasionado, enamorado con RoR e Interesado en la gestión del software.
http://www.jhsilva.com