2012-06-19 19 views
7

Ich habe ein Suchformular, mit vielen Optionen, Eingereicht zu einer Route mit Get-Anfrage. URL ist so etwas wie folgt:So entfernen Sie leere Werte Parameter aus der Abfragezeichenfolge

http://localhost:3000/restaurants/search?utf8=%E2%9C%93&city=&cuisine=&number_of_people=&query=hello 

mit viel mehr params. Ich möchte es sauberer machen so etwas wie entfernen Sie alle Parameter, die leer sind.

etwas wie folgt aus: (Im Grunde genommen alle params zu entfernen, die leer sind)

http://localhost:3000/restaurants/search?query=hello 

Wie dies zu tun?

Eine Möglichkeit können mit

CGI::parse("foo=bar&bar=foo&hello=hi") 

Sie gibt

{"foo"=>["bar"], "hello"=>["hi"], "bar"=>["foo"]} 

Erste Redirect Benutzer auf einem zwischen Aktion und dass zwischen Aktion Prüfung, die params sind leer und sie entfernen und dann schließlich ihn auf die tatsächliche Aktion der Suche umleiten. Aber das klingt sehr lahm. Wie kann ich das besser machen?

+0

Warum leere Werte sind das Problem? –

+0

@SergioTulentsev URLs sauberer zu machen .. –

+0

@SergioTulentsev Es ist eine Suchmaske. Sobald der Benutzer das Formular abschickt. Alles kommt auf. –

Antwort

1

Gerade mit plain ol‘ruby ...

require 'uri' 
a = "http://localhost:8080/path/search?foo=&bar=&baz=2&bat=thing" 
u = URI.parse(a) 
params = u.query.split("&").select {|param| param =~ /=./}.join("&") 
# Returns "baz=2&bat=thing" 
+0

funktioniert nicht dafür: http: // localhost: 3000/restaurants/suche? Utf8 =% E2% 9C% 93 & city = & cuisine = & number_of_people = & booking% 5BDatum_der_buchung% 5D = 19 + Juni + 2012 & buchung% 5Beit_der_buchung% 281i% 29% 5D = & Buchung% 5BZeit_von_Buchung% 282i% 29% 5D = & Buchung% 5BZeit_von_Buchung% 283i% 29% 5D = & Buchung% 5BZeit_von_Buchung% 284i% 29% 5D = & Buchung% 5Beit_von_Buchung% 285i% 29% 5D = & Buchung% 5Beit_von_Buchen% 287i% 29% 5D = -2 & query = & commit = Senden –

+0

es funktioniert hier gut. –

+1

Ich habe 'params.select! {| K, v | v.präsentieren?} ', die das gleiche Ergebnis erhält, aber ich weiß nicht, wie man die Antwort-URL macht, um gereinigt zu werden. – juanpastas

0

Ich würde vorschlagen, wenn nur bei einfachen alten Rubin suchen, eine einfache gsub genug sein könnte:

url.gsub(/[^\?&=]+=(?:&|$)/, '') 

Hinweis: Dies kann ein kaufmännische am Ende verlassen, die mit

getrimmt werden können
url.chomp('&') 
2

Meine Lösung war leer Ein- und Sele deaktivieren cts:

$('form').submit (e) -> 
    $(@).find('select,input').map((i, e) -> e.disabled = !$(e).val()) 

In Bezug auf utf8 Entfernen fand ich this. Also schicke ich es besser weiter.

All dies auf dem Server führte zu einer zusätzlichen Anfrage bei der Verwendung von redirect_to, also bevorzuge ich clientseitigen Code.

1

In Ihrer Controller-Methode, ruft remove_empty_query_params

dann als private Methode:

def remove_empty_query_params 
    # Rewrites /projects?q=&status=failing to /projects?status=failing 
    require 'addressable/uri' 
    original = request.original_url 
    parsed = Addressable::URI.parse(original) 
    return unless parsed.query_values.present? 
    queries_with_values = parsed.query_values.reject { |_k, v| v.blank? } 
    if queries_with_values.blank? 
     parsed.omit!(:query) 
    else parsed.query_values = queries_with_values 
    end 
    redirect_to parsed.to_s unless parsed.to_s == original 
    end 
Verwandte Themen