2013-04-03 16 views
7

mam ten URL:Usunąć końcowe "?" z ciągiem

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

mam pomocnika do usunięcia ?locale=en z 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 

Z tego pomocnika I ten URL http://localhost:3000/blog/posts?. Chciałbym usunąć ciągnik końcowy ?.

Wynik powinien wynosić http://localhost:3000/blog/posts.

+2

Część adresu URL po znaku zapytania nosi nazwę "ciąg zapytania". –

+0

Poprawną odpowiedzią na to jest przypisanie 'nil' do' params', jak mówi Mike Campbell. –

+0

Łatwo zrozumieć, dlaczego próbowałbyś manipulować ciągami w celu masowania zwróconego adresu URL, ale korzystając z klasy zaprojektowanej do zarządzania tymi rzeczami, naprawdę dobrze jest skorzystać z jej funkcji. URI nie jest najlepszym/najbardziej w pełni wyposażonym narzędziem URI dla Rubiego. Spójrz na [adresowalne :: URI] (https://github.com/sporkmonger/addressable), jeśli chcesz czegoś bardziej kompleksowego. –

Odpowiedz

3

Odpowiedzi dotąd wszyscy traktują sam łańcuch. To, co faktycznie robisz, mówi, że ma parametry "". Jeśli zrobisz to, , jeśli nie będziesz miał tego problemu.

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 

coś takiego powinno załatwić sprawę. Powodem tego jest to, że nawet z pustym łańcuchem, URI zakłada, że ​​jest coś do dołączenia, więc umieszcza początkową wartość ?.

+0

Wreszcie ktoś dał właściwą odpowiedź! +1! –

+0

To prawda, ta odpowiedź jest najlepsza. Przepraszam za opóźnienie! – hyperrjas

9

Zastosowanie #gsub:

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

Dziękuję, działa dobrze: D – hyperrjas

8

String#chomp jest taka możliwość.

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

Ostatnią metodą będzie

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

Działa to tylko wtedy, gdy '?' Jest ostatecznym znakiem ciągu. Po tym nie usuwa znaków. –

+3

W rzeczywistości o to prosił. Jeśli przeczytasz jego pytanie i zobaczysz metodę, on już analizuje zapytanie za pomocą 'Rack :: Utils', a następnie generuje ciąg zapytania za pomocą' to_param', a tutaj jest dołączany końcowy znak '?'. –

+1

Masz absolutną rację! W takim przypadku twoja odpowiedź jest najlepsza - przegrywanie. –

Powiązane problemy