2010-09-21 22 views
41

tengo una instalación típica búsqueda en mi aplicación que devuelve una lista de resultados que pueden ser paginado, ordenadas, visto con un valor diferente records_per_page, etc. Cada una de estas opciones es controlado por parámetros en la cadena de consulta. Un ejemplo simplificado:Rieles: Preservar los parámetros de cadena de consulta GET en link_to

/search?q=test&page=2 

Ahora dicen que necesito para mostrar un conjunto de enlaces que establecen el valor records_per_page a 10, 20, 30. Cada enlace debe incluir los parámetros de consulta existentes, que pueden ser un conjunto muy largo, además de un nuevo parámetro por página.

/search?q=test&page=2& ... &per_page=10 
/search?q=test&page=2& ... &per_page=20 
/search?q=test&page=2& ... &per_page=30 

¿Hay una manera fácil de hacerlo con sólo link_to ayudante o que necesito para analizar y reproducir la cadena de consulta de solicitud previa alguna manera?

+0

posible duplicado de [Agregar parámetros de la cadena de consulta para vincular \ _a] (http://stackoverflow.com/questions/2695538/add-querystring-parameters-to-link-to) –

Respuesta

57
link_to 'Link', request.query_parameters.merge({:per_page => 20}) 
+1

Esto agrega algunos parámetros 'adicionales' como 'controller' y' action'. – kikito

+13

Pero puede evitar eso usando 'request.query_parameters' en lugar de' request.parameters' – kikito

+1

use 'deep_merge' si sus parámetros de consulta requieren matrices asociadas o hash anidado – twnaing

2

Puede simplemente arrojar elementos del hash params al . Al igual que

link_to "some_other_link", "/search", :page => params[:page] 
1

¿Qué hay de

<%= link_to 'Whatever', :overwrite_params => { :pear_page => 20 } %> 

?

+1

Esto se parece a lo que estaba buscando . Sin embargo, está obsoleto en Rails 3. link_to 'link', request.parameters.merge ({: per_page => 20}) funcionó para mí. – Vincent

+1

¿Cuál es la forma de los carriles 3.2+ para hacer esto? – coudron

22
link_to 'Link', params.merge({:per_page => 20}) 
0

Un poco tarde sé ..

Si su uso esto como una forma de filtrar los resultados de búsqueda tienen un vistazo a mi ayudante :)

Este automagicly elimina todos en blanco y Parámetros innecesarios y agregue la clase "seleccionada" si todos sus parámetros ya están configurados.

def search_to s, args={} 

    selected = 0 
    args.each do |k, v| 
    selected = selected + 1 if params[k] == v.to_s || (params[k].nil? && v.blank?) 
    end 

    if @search_params_base.nil? 
    @search_params_base = request.parameters.clone 
    @search_params_base.delete(:action) 
    @search_params_base.delete(:controller) 
    @search_params_base.delete(:page) 
    @search_params_base.delete_if{|k, v| v.nil? || v.blank?} 
    @search_params_base.delete(:utf8) if @search_params_base[:keywords].nil? 
    end 
    search_params = @search_params_base.merge(args) 
    search_params.delete_if{|k, v| v.nil? || v.blank?} 

    link_to s, search_path + '?' + search_params.to_param, :class => selected == args.length ? 'selected' : nil 
end 

continuación, puede simplemente utilizar esto en su vista:

search_to '$80 to $110', :price => 80..110 

o en su caso:

search_to '30 per page', :page => params[:page], :per_page => 30 
1

Esto funciona si los enlaces que está procesando no se les da a usted por request.params.

require 'rack/utils'                     
require 'uri'                      

def modify_query url, options={}                  
    uri = URI(url)                      
    query_hash = Rack::Utils.parse_query(uri.query)             
    query_hash.merge!(options)                   
    uri.query = Rack::Utils.build_query(query_hash)             
    uri.to_s                       
end                         

puts modify_query('/search?q=test&page=2&per_page=10', 'per_page' => 20)       
puts modify_query('/search?q=test&page=2', 'per_page' => 30)           

# Outputs                       
# /search?q=test&page=2&per_page=20                 
# /search?q=test&page=2&per_page=30 
3

Si desea mantener params existentes y no se exponga a ataques XSS, asegúrese de limpiar el hash params, dejando sólo los parametros que su aplicación puede estar enviando:

# inline 
<%= link_to 'Link', params.slice(:sort).merge(per_page: 20) %> 

 

Si lo usa en varios lugares, limpiar los parametros en el controlador:

# your_controller.rb 
@params = params.slice(:sort, :per_page) 

# view 
<%= link_to 'Link', @params.merge(per_page: 20) %> 
12

La forma más sencilla de combinar los nuevos parametros con los parámetros de consulta y no con todos los parámetros (incluidas las obtenidas a través de la ruta de acceso) es fusionarse con petición.query_parameters

link_to 'Search', search_path(request.query_parameters.merge({ per_page: 20 })) 

De lo contrario se termina con cadenas de consulta duplicar los parámetros de ruta, por ejemplo, en lugar de ?action=index&controller=products&foo=bar?foo=bar.

+0

Esta debería ser la respuesta aceptada. – Agis

Cuestiones relacionadas