2010-09-21 11 views
41

Ich habe eine typische Suchfunktion in meiner App, die eine Liste von Ergebnissen zurückgibt, die paginiert, sortiert, mit einem anderen records_per_page-Wert angezeigt werden können usw. Jede dieser Optionen wird durch gesteuert Parameter in der Abfragezeichenfolge. Ein vereinfachtes Beispiel:Rails: GET Abfrage String-Parameter in link_to

/search?q=test&page=2 

Nun sage ich brauche eine Reihe von Links anzuzeigen, die datensätze_pro_seite Wert auf 10, 20, 30. Jeder Link muss umfassen die bestehenden Abfrageparameter festgelegt, die eine sehr lange eingestellt werden kann, und ein neuer per_page-Parameter.

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

Gibt es eine einfache Möglichkeit, es mit nur link_to Helfern zu tun, oder ich brauche den Abfrage-String aus früheren Anfrage irgendwie zu analysieren und zu reproduzieren?

+0

mögliche Duplikate von [Hinzufügen querystring Parameter zu verknüpfen \ _to] (http://stackoverflow.com/questions/2695538/add-querystring-parameters-to-link-to) –

Antwort

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

Dies fügt einige zusätzliche Parameter wie "Controller" und "Action" hinzu. – kikito

+13

Sie können dies jedoch vermeiden, indem Sie 'request.query_parameters' anstelle von' request.parameters' verwenden – kikito

+1

verwenden Sie 'deep_merge' wenn Ihre Abfrageparameter assoziierte Arrays oder verschachtelten Hash benötigen – twnaing

2

Sie können Elemente des params Hashs einfach an link_to werfen. Wie

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

Was

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

?

+1

Das sieht genau so aus, was ich gesucht habe . In Rails 3 ist es jedoch veraltet. Link_to 'link', request.parameters.merge ({: per_page => 20}) hat für mich funktioniert. – Vincent

+1

Was ist die Schienen 3.2 + Möglichkeit, dies zu tun? – coudron

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

Ein bisschen spät weiß ich ..

Wenn Ihr mit dieser als eine Möglichkeit, die Suchergebnisse haben einen Blick auf meine Helfer zu filtern :)

Diese automagicly entfernt alle leer und nicht benötigte Parameter und fügen die Klasse "selected" hinzu, wenn alle neuen Parameter bereits gesetzt wurden.

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 

Anschließend können Sie diese einfach in Ihrer Ansicht verwenden:

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

Oder in Ihrem Fall:

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

Dies funktioniert, wenn die Links, die Sie verarbeiten Ihnen nicht gegeben werden von 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

Wenn Sie bestehende params halten und nicht aussetzen, sich XSS-Angriffe, sollten Sie die params-Hash zu reinigen, so dass nur die params, dass Ihre App zu senden können:

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

 

Wenn Sie es an mehreren Stellen verwenden, reinigen Sie die params in der Steuerung:

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

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

Die einfachste Möglichkeit, die neuen Parameter mit den Abfrageparametern und NICHT mit allen Parametern (einschließlich der durch den Pfad erhaltenen Parameter) zusammenzuführen, ist die Zusammenführung mit der Anforderung .query_parameters

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

Andernfalls Sie am Ende mit Query-Strings der Pfadparameter zu duplizieren, zum Beispiel ?action=index&controller=products&foo=bar statt ?foo=bar.

+0

Dies sollte die akzeptierte Antwort sein. – Agis