2015-10-21 21 views
5

Jak skonstruować obiekt URI z argumentami zapytania, przekazując skrót?Jak skonstruować URI z argumentami zapytania z mieszania w Ruby

mogę wygenerować zapytania z:

URI::HTTPS.build(host: 'example.com', query: "a=#{hash[:a]}, b=#{[hash:b]}")

który generuje

https://example.com?a=argument1&b=argument2

jednak myślę konstruowania ciąg kwerendy na wiele argumentów byłby nieczytelny i trudny do utrzymania. Chciałbym skonstruować ciąg zapytania, przekazując skrót. Podobnie jak w poniższym przykładzie:

hash = { 
    a: 'argument1', 
    b: 'argument2' 
    #... dozen more arguments 
} 
URI::HTTPS.build(host: 'example.com', query: hash) 

która podnosi

NoMethodError: undefined method `to_str' for {:a=>"argument1", :b=>"argument2"}:Hash 

to możliwe, aby zbudować ciąg kwerendy na podstawie hash używając URI API? Nie chcę, aby obiekt hash łatki małpa ...

Odpowiedz

8

Po prostu zadzwoń '#to_query' na hash.

hash = { 
    a: 'argument1', 
    b: 'argument2' 
    #... dozen more arguments 
} 
URI::HTTPS.build(host: 'example.com', query: hash.to_query) 

=> https://example.com?a=argument1&b=argument2

Jeśli nie używasz szyny pamiętać require 'uri'

+7

'to_query 'jest metodą tylko Railsową. Nie istnieje w Ruby. –

+1

Pytania @marc_ferna ma ruby ​​na tagu szyn. Możesz włączyć: ActiveSupport w projektach poza szynami –

1

dla tych, które nie stosują Rails lub Active Support rozwiązanie stosując standardową bibliotekę Ruby jest

hash = { 
    a: 'argument1', 
    b: 'argument2' 
} 
URI::HTTPS.build(host: 'example.com', query: URI.encode_www_form(hash)) 
=> #<URI::HTTPS https://example.com?a=argument1&b=argument2> 
Powiązane problemy