Foros del Web » Programando para Internet » Ruby »

Combos dependiente en Ruby

Estas en el tema de Combos dependiente en Ruby en el foro de Ruby en Foros del Web. Hola a todos, Estoy usando ruby 1.8.7 y rails 2.3.14, estoy intentando crear 2 combos donde el 2do depende de lo que se seleccione en ...
  #1 (permalink)  
Antiguo 08/04/2012, 13:24
 
Fecha de Ingreso: abril-2006
Ubicación: Venezuela
Mensajes: 126
Antigüedad: 14 años, 6 meses
Puntos: 0
Combos dependiente en Ruby

Hola a todos,

Estoy usando ruby 1.8.7 y rails 2.3.14, estoy intentando crear 2 combos donde el 2do depende de lo que se seleccione en el primero.

El 1ro lee de la tabla proyecto y el 2do busca las fases de ese proyecto seleccionado y esas 2 selecciones debe insertarse en la tabla activifases.

Intente utilizar la libreria de javascript http://ajax.googleapis.com/ajax/libs.../jquery.min.js y no me funciono.

En el controlador de Fases cree el siguiente metodo
Código:
def for_proyectoid 
    @fases = Fase.find_all_by_proyecto_id(params[:id])
    #Notifier.deliver_gmail_message('[email protected]', @fases.descripcion, 'enviando correo de prueba')
    respond_to do | format |
        format.json  { render :json => @fases }
    end
  end
en el new de activifases coloque lo siguiente:
Código:
<script type="text/javascript">
    $(document).ready(function(){
        $("select#activifase_proyecto_id").change(function(){
            var id_value_string = $(this).val();
            alert(id_value_string);
            if (id_value_string == "") { 
                // if the id is empty remove all the fases options from being selectable and do not do any ajax
                $("select#activifase_fase_id option").remove();
                var row = "<option value=\"" + "" + "\">" + "" + "</option>";
                $(row).appendTo("select#activifase_fase_id");
                
            }
            else {
                // Send the request and update sub category dropdown 
                $.ajax({
                    dataType: "json",
                    cache: false,
                    url: '/fases/for_proyectoid/' + id_value_string,
                    timeout: 5000,
                    error: function(XMLHttpRequest, errorTextStatus, error){
                        alert("Failed to submit : "+ errorTextStatus+" ;"+error);
                    },
                    success: function(data){                           
                        // Clear all options from sub category select 
                        //put in a empty default line
                        var row = "<option value=\"" + "" + "\">" + "" + "</option>";
                        $(row).appendTo("select#activifase_fase_id"); 
                        alert( $("select#activifase_fase_id"));                        
                        // Fill sub category select                         
                        $.each(data, function(i, j){
                            row = "<option value=\"" + j.fases.id + "\">" + j.fases.descripcion + "</option>";                             
                            $(row).appendTo("select#activifase_fase_id");   
                                                     
                        });             
                     }
                });
            };
                });
    });
</script>
<% form_for @activifase do |f| %>
  <p>
    <%= f.label :proyecto_id %>
    <%= f.collection_select :proyecto_id, Proyecto.find_by_sql("select c.* from jerarquias x, usuarios b ,jerarquias_proyectos d , proyectos c where x.empleado_id = b.id and   nvl(x.fecha_hasta, sysdate)>=sysdate and   d.supervisor_id = x.supervisor_id and   d.empleado_id   = x.empleado_id and   to_number(c.creado_por) = x.supervisor_id and   nvl(c.fecha_hasta,sysdate)>=sysdate and   c.id = d.proyecto_id and   b.id = #{@user.id}"), :id, :descripcion, :prompt => "Seleccione un Proyecto" %>
  </p>
  <p >
    <%= f.label :fase_id %>
   <%= f.collection_select :fase_id, Fase.find_all_by_proyecto_id(@activifase.proyecto_id), :id, :descripcion, :prompt => '' %>
  </p>  
<% end %>
Probe y el 2do combo no se esta llenando, pense que el procedimiento for_proyectoid (controlador fases) no estaba funcionando sin embargo al correrlo desde el explorer " http://localhost:3000/fases/for_proyectoid/10120 " me retorna lo siguiente
Código:
[{"fase":{"proyecto_id":10120,"created_at":"2012-04-06T22:36:04Z","updated_at":"2012-04-06T22:36:04Z","descripcion":"Analisis","id":10100,"fecha_desde":"2012-04-06T00:00:00Z","tiempo_estimado":null,"fecha_hasta":"2012-04-17T00:00:00Z","status":null}},{"fase":{"proyecto_id":10120,"created_at":"2012-04-06T22:36:04Z","updated_at":"2012-04-06T22:36:04Z","descripcion":"Dise\u00f1o ","id":10101,"fecha_desde":"2012-04-18T00:00:00Z","tiempo_estimado":null,"fecha_hasta":"2012-04-26T00:00:00Z","status":null}},{"fase":{"proyecto_id":10120,"created_at":"2012-04-06T22:36:04Z","updated_at":"2012-04-06T22:36:04Z","descripcion":"Implementacion","id":10102,"fecha_desde":"2012-04-26T00:00:00Z","tiempo_estimado":null,"fecha_hasta":"2012-05-06T00:00:00Z","status":null}},{"fase":{"proyecto_id":10120,"created_at":"2012-04-07T17:46:30Z","updated_at":"2012-04-07T17:46:30Z","descripcion":null,"id":10120,"fecha_desde":"2012-04-07T00:00:00Z","tiempo_estimado":null,"fecha_hasta":"2012-04-07T00:00:00Z","status":null}}]
He revisado iles de veces y ya no se que hacer, por favor si me pueden ayudar, se los agradecere infinitamente.

Saludos,
Patricia
  #2 (permalink)  
Antiguo 09/04/2012, 17:16
 
Fecha de Ingreso: abril-2006
Ubicación: Venezuela
Mensajes: 126
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Combos dependiente en Ruby

Por favort alguien que me pueda ayudar =(
  #3 (permalink)  
Antiguo 19/04/2012, 20:31
Avatar de jhsilva  
Fecha de Ingreso: mayo-2009
Mensajes: 85
Antigüedad: 11 años, 4 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

Etiquetas: combos, dependiente, rails, request
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:23.