Forum: Rails-ES Filtrar con Ajax Scaffold

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
81d591bf78ee92fab9a5abda19b6fe9a?d=identicon&s=25 Fernando González Macías (Guest)
on 2007-03-02 11:33
(Received via mailing list)
Estoy realizando mi primer programa en RoR y utilizo Ajax Scaffold con
el generador. Me gustaría implementar algún tipo de filtrado en función
de algunas condiciones que se estableciera. Bien por el valor obtenido
de un Combo, o bien por un CheckBox. Imagino que esto hay que
implementarlo en el layout.



¿Alguien podría darme algún ejemplo? Y como la elección realizada
modifica el subconjunto de registros a visualizar.



Saludos y gracias...



Fernando González Macías

fgonzalez @ grupojoly.com
E91518f050cb6081186ff461950099e0?d=identicon&s=25 Luis Villegas (Guest)
on 2007-03-02 11:45
(Received via mailing list)
yo lo tengo con un combo:

en el rhtml

<div class="nuevo_bloque">
  <span class="txt_titulo">Incidencias</span>
      <span style="font-size:11px;font-weight:bold;">estado:
        <select name="filtro_estado" id="filtro_estado"
onchange="actualizaCapaIncidencias()">
            <option value ="(1,2,3,4,5,6,7,8)">
                Abiertas
            </option>
            <option value ="(9)">
                Cerradas
            </option>
            <option value = "(1,2,3,4,5,6,7,8,9)">
                Todas
            </option>
        </select>
    </span>
 </div>
 <div  class="nuevo_bloque" id ="capa_listado_incidencias" >
        <%= render_component :controller => '/incidencias', :action =>
'list', :params => params %>
  </div>
<script>
 function actualizaCapaIncidencias(){
        new Ajax.Updater('capa_listado_incidencias',
                '/incidencias/list?filtro_estado='+$F('filtro_estado'),
                  {asynchronous:true, evalScripts:true})
}
</script>

En el controlador:

  def component
    filtro_estado = params[:filtro_estado] || "(1,2,3,4,5,6,7,8)"
    @show_wrapper = true if @show_wrapper.nil?
    @sort_sql =
Incidencia.scaffold_columns_hash[current_sort(params)].sort_sql
rescue nil
  @sort_by = @sort_sql.nil? ? "#{Incidencia.table_name}.estado_id asc" :
@sort_sql  + " " + current_sort_direction(params)
    condiciones = ["estado_id in "+filtro_estado]
   @paginator, @incidencias = paginate(:incidencias,
                                        :order => @sort_by,
                                        :per_page => default_per_page,
                                        :conditions => condiciones )

    render :action => "component", :layout => false
  end


A ver si te sirve
81d591bf78ee92fab9a5abda19b6fe9a?d=identicon&s=25 Fernando González Macías (Guest)
on 2007-03-05 21:30
(Received via mailing list)
Hola Luis, muchas gracias por contestar.



Respecto a tú código tengo dos problemas:



1)       El fichero .rhtml que estoy actualizando con tú código es el
component.rhtml. Una vez que situo el siguiente código:





<div  class="filtro_estado_prestamos" id ="capa_listado_prestamos" >

        <%= render_component :controller => '/prestamos', :action =>
'list', :params => params %>

  </div>



<script>
 function actualizaCapaIncidencias(){
        new Ajax.Updater('capa_listado_prestamos',
                '/incidencias/list?filtro_estado='+$F('filtro_estado'),
                  {asynchronous:true, evalScripts:true})
}
</script>





Me entra en una especie de bucle, listándome continuamente el grid,
junto con el combo de selección, una y otra vez, hasta que me da un
error. ¿No es en este fichero donde hay que situar este código?



2)      El segundo problema es con respecto, al código a introducir en
el controlador. Quiero filtrar por el estado de un campo fecha, en
función de que ese campo tenga valor o no, o bien que me muestre todos
los registros. Por lo tanto defino un combo de selección con préstamos
Abiertos, Cerrados y Todos. A los préstamos aún no devueltos se le
asigna en el campo fecha de devolución a NULL. El caso es que no tengo
nada claro como definir la condición para que el select la incorpore.





Tengo lo siguiente en el controlador:



def component



    filtro_estado = params[:filtro_estado] || "0"

    @show_wrapper = true if @show_wrapper.nil?

    @sort_sql =
Prestamo.scaffold_columns_hash[current_sort(params)].sort_sql rescue nil

    @sort_by = @sort_sql.nil? ?
"#{Prestamo.table_name}.#{Prestamo.primary_key} asc" : @sort_sql  + " "
+ current_sort_direction(params)



    logger.debug("Valor de filtro_estado"+filtro_estado)

    case filtro_estado

      when '1'

        logger.debug("Valor 1")



        condiciones = ["fecha_devolucion =  null"]

      when "2"

      logger.debug("Valor 2")



        condiciones = ["fecha_devolucion != null"]

    else

        logger.debug("Entra en ELSE")



        condiciones = ["fecha_devolucion != ?", '1900/01/01']

      end







    @paginator, @prestamos = paginate(:prestamos,  :order => @sort_by,
:per_page => default_per_page, :conditions => condiciones )



       render :action => "component", :layout => false

  end





Aquí como es evidente tengo varias dudas. La primera línea filtro_estado
= params[:filtro_estado] || "0", sino me equivoco debe de recoger el
valor de la selección del combo y si no se realiza le asigna un 0.



¿Como puedo establecer que la fecha sea null o no null? Tal como lo he
puesto no me va.




Saludos y gracias.....





Fernando González Macías





________________________________

De: ror-es-bounces@lists.simplelogica.net
[mailto:ror-es-bounces@lists.simplelogica.net] En nombre de Luis
Villegas
Enviado el: viernes, 02 de marzo de 2007 11:44
Para: La lista sobre Ruby On Rails (rubyonrails.com) en castellano
Asunto: Re: [Ror-es] Filtrar con Ajax Scaffold



yo lo tengo con un combo:

en el rhtml

<div class="nuevo_bloque">
  <span class="txt_titulo">Incidencias</span>
      <span style="font-size:11px;font-weight:bold;">estado:
        <select name="filtro_estado" id="filtro_estado"
onchange="actualizaCapaIncidencias()">
            <option value ="(1,2,3,4,5,6,7,8)">
                Abiertas
            </option>
            <option value ="(9)">
                Cerradas
            </option>
            <option value = "(1,2,3,4,5,6,7,8,9)">
                Todas
            </option>
        </select>
    </span>
 </div>
 <div  class="nuevo_bloque" id ="capa_listado_incidencias" >
        <%= render_component :controller => '/incidencias', :action =>
'list', :params => params %>
  </div>
<script>
 function actualizaCapaIncidencias(){
        new Ajax.Updater('capa_listado_incidencias',
                '/incidencias/list?filtro_estado='+$F('filtro_estado'),
                  {asynchronous:true, evalScripts:true})
}
</script>

En el controlador:

  def component
    filtro_estado = params[:filtro_estado] || "(1,2,3,4,5,6,7,8)"
    @show_wrapper = true if @show_wrapper.nil?
    @sort_sql =
Incidencia.scaffold_columns_hash[current_sort(params)].sort_sql rescue
nil
  @sort_by = @sort_sql.nil? ? "#{Incidencia.table_name}.estado_id asc" :
@sort_sql  + " " + current_sort_direction(params)
    condiciones = ["estado_id in "+filtro_estado]
   @paginator, @incidencias = paginate(:incidencias,
                                        :order => @sort_by,
                                        :per_page => default_per_page,
                                        :conditions => condiciones )

    render :action => "component", :layout => false
  end


A ver si te sirve




On 3/2/07, Fernando González Macías <fgonzalez@diariodecadiz.com> wrote:

Estoy realizando mi primer programa en RoR y utilizo Ajax Scaffold con
el generador. Me gustaría implementar algún tipo de filtrado en función
de algunas condiciones que se estableciera. Bien por el valor obtenido
de un Combo, o bien por un CheckBox. Imagino que esto hay que
implementarlo en el layout.



¿Alguien podría darme algún ejemplo? Y como la elección realizada
modifica el subconjunto de registros a visualizar.



Saludos y gracias...



Fernando González Macías

fgonzalez @ grupojoly.com
E91518f050cb6081186ff461950099e0?d=identicon&s=25 Luis Villegas (Guest)
on 2007-03-06 10:15
(Received via mailing list)
Buenas.

Veo que en tu script pone:
<script>
 function actualizaCapaIncidencias(){
        new Ajax.Updater('capa_listado_prestamos',
                '/incidencias/list?filtro_estado='+$F('filtro_estado'),
                  {asynchronous:true, evalScripts:true})
}
</script>


¿seguro que el controlador se llama "incidencias"?¿no debería ser
"préstamos"?
Aparte, en component.rhtml no debería ir ir:

<%= render_component :controller => '/prestamos', :action => 'list',
:params
=> params %>

porque se está llamando a sí mismo continuamente. Tienes que poner el
código
en otro rhtml.


En cuanto a tu segunda duda:

Dices:
La primera línea filtro_estado = params[:filtro_estado] || "0", sino me
equivoco debe de recoger el valor de la selección del combo y si no se
realiza le asigna un 0.
Realmente sólo le asigna 0 si es nulo params[:filtro_estado]. Si está en
blanco, el valor de filtro_estado será una cadena vacía.
La condición sería algo así:
if params[:filtro_estado].blank?
    filtro_estado = params[:filtro_estado]
else
   filtro_estado = "0"
end

Y lo de que la fecha no sea null, no lo he entendido muy bien. Podrías
explicara los campos que tienes en el html y en la BD y qué es
exactamente
lo que quieres que haga?

Un saludo
This topic is locked and can not be replied to.