2010-09-21 6 views
41

Ho una tipica funzione di ricerca nella mia app che restituisce un elenco di risultati che possono essere impaginati, ordinati, visualizzati con un valore differente record_per_page, ecc. Ognuna di queste opzioni è controllata da parametri nella stringa di query. Un esempio semplificato:Rails: Preservazione dei parametri della stringa di query GET in link_to

/search?q=test&page=2 

Ora dire che ho bisogno di visualizzare una serie di link che impostare il valore records_per_page a 10, 20, 30. Ogni collegamento deve includere i parametri di query esistenti, che può essere un tempo molto lungo insieme, più un nuovo parametro per_page.

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

C'è un modo semplice per farlo con solo link_to aiuto o ho bisogno di analizzare e riprodurre la stringa di query da una precedente richiesta in qualche modo?

+0

possibile duplicato di [Aggiungi parametri querystring per collegare \ _to] (http://stackoverflow.com/questions/2695538/add-querystring-parameters-to-link-to) –

risposta

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

Aggiunge alcuni parametri "extra" come 'controller' e' action'. – kikito

+13

Ma si può evitare usando 'request.query_parameters' invece di' request.parameters' – kikito

+1

usa 'deep_merge' se i parametri di query richiedono array associati o hash annidato – twnaing

2

È possibile inserire gli elementi dell'habit params allo link_to. Come

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

Che dire

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

?

+1

Questo sembra proprio quello che stavo cercando . Tuttavia è deprecato in Rails 3. link_to 'link', request.parameters.merge ({: per_page => 20}) ha funzionato per me. – Vincent

+1

Che cos'è il binario 3.2+ per farlo? – coudron

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

un po 'tardi lo so ..

Se la vostra utilizzando questo come un modo per filtrare i risultati di ricerca hanno uno sguardo al mio aiuto :)

Questo automagicly rimuove tutto in bianco e parametri non necessari e aggiungere la classe "selezionata" se tutti i nuovi parametri erano già impostati.

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 

È possibile poi basta usare questo a suo avviso:

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

o nel vostro caso:

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

Questo funziona se i collegamenti si stanno elaborando non sono dati a voi da 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

Se si desidera mantenere params esistenti e non esporsi ad attacchi XSS, assicurarsi di pulire l'hash params, lasciando solo i params che la vostra applicazione può essere l'invio:

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

 

Se lo si utilizza in più luoghi, pulire i params nel controller:

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

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

Il modo più semplice per unire i nuovi parametri con i parametri di query e NOT con tutti i parametri (compresi quelli ottenuti tramite il percorso) è di unire con la richiesta .query_parameters

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

Altrimenti si finisce con stringhe di query duplicare i parametri del percorso, ad esempio, invece di ?action=index&controller=products&foo=bar?foo=bar.

+0

Questa dovrebbe essere la risposta accettata. – Agis