Filtrar con Ajax Scaffold


#1

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


#2

yo lo tengo con un combo:

en el rhtml

Incidencias estado: Abiertas Cerradas Todas
<%= render_component :controller => '/incidencias', :action => 'list', :params => params %>

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


#3

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:

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

‘list’, :params => params %>

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?

  1.  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: removed_email_address@domain.invalid
[mailto:removed_email_address@domain.invalid] 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

Incidencias estado: Abiertas Cerradas Todas
<%= render_component :controller => '/incidencias', :action => 'list', :params => params %>

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 removed_email_address@domain.invalid 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


#4

Buenas.

Veo que en tu script pone:

¿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