2015-10-21 2 views
5

Как построить объект URI с аргументами запроса, передавая хэш?Как построить URI с аргументами запроса из hash в Ruby

я могу генерировать запрос с:

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

, который генерирует

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

однако я думаю, построение строки запроса для многих аргументов будет нечитаемым и трудно поддерживать. Я хотел бы построить строку запроса, передав хеш. Как и в примере ниже:

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

, который поднимает

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

Можно ли построить строку запроса на основе хэш с использованием URI API? Я не хочу, чтобы объект хэш-объекта обезьяны ...

ответ

8

Просто позвоните '#to_query' на хэш.

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

Если вы не используете рельсы не забудьте require 'uri'

+7

'to_query 'является единственным методом Rails. Это не существует в Ruby. –

+1

Вопросы @marc_ferna имеют рубин на теге rails. Вы можете включить: ActiveSupport в проекты без рельсов –

1

Для тех, не использующих Rails или активной поддержки, решение с использованием стандартной библиотеки Ruby, является

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> 

 Смежные вопросы

  • Нет связанных вопросов^_^