2011-01-11 12 views
6

w Pythonie, mogę to zrobić:nawrócony rubin hash do zapytań URL ciąg ... bez tych nawiasach kwadratowych

>>> import urlparse, urllib 
>>> q = urlparse.parse_qsl("a=b&a=c&d=e") 
>>> urllib.urlencode(q) 
'a=b&a=c&d=e' 

w Ruby [+ Rails] Nie mogę dowiedzieć się, jak zrobić to samo bez "przetaczania się", co wydaje się dziwne. Szyny sposób nie działa na mnie - dodaje nawiasów kwadratowych do nazw parametrów zapytania, które serwer na drugim końcu może lub nie może wspierać:

>> q = CGI.parse("a=b&a=c&d=e") 
=> {"a"=>["b", "c"], "d"=>["e"]} 
>> q.to_params 
=> "a[]=b&a[]=c&d[]=e" 

Moje przypadek użycia jest po prostu, że ja chcesz spłukać wartości niektórych wartości w części adresu URL. Wydawało się naturalne, aby oprzeć się na standardowej biblioteki i/lub szyn i napisać coś takiego:

uri = URI.parse("http://example.com/foo?a=b&a=c&d=e") 
q = CGI.parse(uri.query) 
q.delete("d") 
q["a"] << "d" 
uri.query = q.to_params # should be to_param or to_query instead? 
puts Net::HTTP.get_response(uri) 

ale tylko jeśli otrzymany URI jest w rzeczywistości, a nie http://example.com/foo?a=b&a=c&a=dhttp://example.com/foo?a[]=b&a[]=c&a[]=d. Czy istnieje poprawny lub lepszy sposób na zrobienie tego?

+0

ja widziałem http://bit.ly/gc2Ylj, co skłoniło mnie do szybko napisać https://gist.github.com/774142, co ja myślę * * realizuje co Chcę. Chociaż chciałem, żeby nie * przeturlać się. :-) – Charlie

Odpowiedz

0

Sposób, w jaki szyny traktują łańcuchy zapytania tego typu, oznacza, że ​​musisz przetasować własne rozwiązanie, tak jak Ty. To trochę niefortunne, jeśli masz do czynienia z aplikacjami, które nie są railsami, ale ma to sens, jeśli przekazujesz informacje do i od aplikacji rails.

6

Oto krótka funkcja, aby włączyć hash do parametrów zapytania:

require 'uri' 
def hash_to_query(hash) 
    return URI.encode(hash.map{|k,v| "#{k}=#{v}"}.join("&")) 
end 
+0

Sortuje klucze w kolejności alfabetycznej. – mrudult

+0

To nie powoduje prawidłowej ucieczki kluczy ani wartości. –

-1

jako prosty zwykły roztwór Ruby (lub RubyMotion, w moim przypadku), wystarczy użyć tego:

class Hash 
    def to_param 
    self.to_a.map { |x| "#{x[0]}=#{x[1]}" }.join("&") 
    end 
end 

{ fruit: "Apple", vegetable: "Carrot" }.to_param # => "fruit=Apple&vegetable=Carrot" 

It obsługuje tylko proste skróty.

17

We współczesnej Ruby jest to po prostu:

require 'uri' 
URI.encode_www_form(hash) 
+0

Oto dokumentacja dla stdlib-2.1.0: https://ruby-doc.org/stdlib-2.1.0/libdoc/uri/rdoc/URI.html#method-c-encode_www_form –

1

Szybkie Hash do zapytaniu URL trick:

"http://www.example.com?" + { language: "ruby", status: "awesome" }.to_query 

# => "http://www.example.com?language=ruby&status=awesome" 

Chcesz zrobić to w odwrotnej kolejności? Zastosowanie CGI.parse:

require 'cgi' 
# Only needed for IRB, Rails already has this loaded 

CGI::parse "language=ruby&status=awesome" 

# => {"language"=>["ruby"], "status"=>["awesome"]} 
Powiązane problemy