2013-04-03 4 views
7

ho questo url:Rimuovi "?" da una stringa

http://localhost:3000/blog/posts?locale=en 

ho un aiutante per rimuovere ?locale=en di url:

def url_without_locale_params(url) 
    uri = URI url 
    params = Rack::Utils.parse_query uri.query 
    params.delete 'locale' 
    uri.query = params.to_param 
    uri.to_s 
end 

Con questo aiuto ho questa url http://localhost:3000/blog/posts?. Vorrei eliminare il trailing ?.

Il risultato dovrebbe essere http://localhost:3000/blog/posts.

+2

La parte dell'URL dopo il punto interrogativo è chiamata "stringa di query". –

+0

La risposta corretta a questo è assegnare 'nil' a' params' come dice Mike Campbell. –

+0

È facile capire perché si dovrebbe provare a utilizzare la manipolazione delle stringhe per massaggiare l'URL restituito, ma, quando si utilizza una classe progettata per gestire quella roba, è molto utile approfittare delle sue funzionalità. L'URI non è lo strumento URI migliore/più completo per Ruby. Guarda [Addressable :: URI] (https://github.com/sporkmonger/addressable) se vuoi qualcosa di più completo. –

risposta

3

Le risposte finora tutti considerano la stringa stessa. Quello che stai facendo è dire che ha i parametri "". Se lo fai nil se params.to_param == "" non avrai questo problema.

def url_without_locale_params(url) 
    uri = URI url 
    params = Rack::Utils.parse_query uri.query 
    params.delete 'locale' 
    uri.query = params.to_param.blank? ? nil : params.to_param 
    uri.to_s 
end 

qualcosa del genere dovrebbe fare il trucco. La ragione di ciò è che anche con una stringa vuota, l'URI presuppone che ci sia qualcosa da aggiungere, quindi inserisce l'iniziale ?.

+0

Infine, qualcuno ha dato la risposta giusta! +1! –

+0

È corretto, questa risposta è la migliore. Scusa per il ritardo! – hyperrjas

9

Uso #gsub:

uri = "http://localhost:3000/blog/posts?locale=en" 
uri.gsub(/\?.*/, '') 
    #=> "http://localhost:3000/blog/posts" 
+0

Grazie, funziona perfettamente: D – hyperrjas

8

String#chomp è una possibilità.

1.9.3p392 :002 > "foobar?".chomp("?") 
=> "foobar" 

Procedimento finale sarà

def url_without_locale_params(url) 
    uri = URI url 
    params = Rack::Utils.parse_query uri.query 
    params.delete 'locale' 
    uri.query = params.to_param 
    uri.to_s.chomp("?") 
end 
+0

Funziona solo se '?' È il carattere finale della stringa. Dopo questo non rimuove i caratteri. –

+3

In effetti, questo è quello che ha chiesto. Se leggi la sua domanda e vedi il metodo, sta già analizzando la query usando 'Rack :: Utils', quindi genera la stringa di query usando' to_param' ed ecco dove viene aggiunto il finale '?'. –

+1

Hai assolutamente ragione! In tal caso, la tua risposta è la migliore - upvoting. –