2012-06-19 23 views
7

Ho un modulo di ricerca, con molte opzioni, Inserito in un percorso con Richiedi richiesta. URL è simile al seguente:Come rimuovere i valori vuoti param dalla stringa di query

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

con molti più parametri. Voglio renderlo più pulito qualcosa come rimuovere tutti i parametri che sono vuoti.

qualcosa di simile: (In pratica la rimozione di tutti i params, che sono vuoti)

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

Come fare questo?

Un modo può essere utilizzando

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

Fornisce

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

primo utente di reindirizzamento su una tra azione e in quella tra controllo azione che params sono vuoti e rimuoverli e poi finalmente reindirizzandolo sull'effettiva azione di ricerca. Ma suona molto male. Come posso farlo in un modo migliore?

+0

Perché sono valori vuoti il ​​problema? –

+0

@SergioTulentsev Per rendere gli URL più puliti .. –

+0

@SergioTulentsev È un modulo di ricerca. Una volta che l'utente invia il modulo. Tutto viene fuori. –

risposta

1

Basta con la pianura 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

non funziona per questo: http: // localhost: 3000/restaurants/search? Utf8 =% E2% 9C% 93 & city = & cuisine = & number_of_people = & booking% 5Bdate_of_booking% 5D = 19 + giugno + 2012 e prenotazione% 5Btime_of_booking% 281i% 29% 5D = & prenotazione% 5Btime_of_booking% 282i% 29% 5D = & prenotazione% 5Btime_of_booking% 283i% 29% 5D = & prenotazione% 5Btime_of_booking% 284i% 29% 5D = & prenotazione% 5Btime_of_booking% 285i% 29% 5D = & prenotazione% 5Btime_of_booking% 287i% 29% 5D = -2 & query = & commit = Invia –

+0

funziona bene qui. –

+1

Ho fatto 'params.select! {| K, v | v.present?} 'che ottiene lo stesso risultato, ma non so come rendere l'URL della risposta da pulire. – juanpastas

0

vorrei suggerire, se solo guardando pianura vecchio rubino, un semplice gsub potrebbe essere sufficiente:

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

Nota: questo può lasciare una e commerciale alla fine, che può essere tagliato con

url.chomp('&') 
2

La mia soluzione era disabilitare gli input vuoti e sele cts:

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

Per quanto riguarda la rimozione utf8 ho trovato this. Quindi è meglio che continui a inviarlo.

L'esecuzione di tutto questo sul server ha comportato un'ulteriore richiesta durante l'utilizzo di redirect_to, quindi preferisco utilizzare il codice lato client.

1

nel metodo di controllo, chiamare remove_empty_query_params

Poi, come un metodo privato:

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 
Problemi correlati