конвертировать рубиновый хеш в строку запроса URL ... без этих квадратных скобок - PullRequest
10 голосов
/ 11 января 2011

В Python я могу сделать это:

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

В Ruby [+ Rails] я не могу понять, как сделать то же самое, не "катя себя", что кажется странным.Способ Rails у меня не работает - он добавляет квадратные скобки к именам параметров запроса, которые сервер на другом конце может поддерживать или не поддерживать:

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

Мой вариант использования просточто я хотел бы смешать со значениями некоторых значений в части query-string URL.Казалось естественным опереться на стандартную библиотеку и / или Rails и написать что-то вроде этого:

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)

, но только если результирующий URI действительно http://example.com/foo?a=b&a=c&a=d, а не http://example.com/foo?a[]=b&a[]=c&a[]=d.Есть ли правильный или лучший способ сделать это?

Ответы [ 5 ]

27 голосов
/ 04 декабря 2015

В современном рубине это просто:

require 'uri'
URI.encode_www_form(hash)
5 голосов
/ 26 июня 2013

Вот быстрая функция, чтобы превратить ваш хэш в параметры запроса:

require 'uri'
def hash_to_query(hash)
  return URI.encode(hash.map{|k,v| "#{k}=#{v}"}.join("&"))
end
2 голосов
/ 13 января 2017

Быстрый хэш для URL-запроса Трюк :

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

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

Хотите сделать это в обратном порядке? Использовать CGI.parse:

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

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

# => {"language"=>["ruby"], "status"=>["awesome"]} 
0 голосов
/ 03 января 2014

В качестве простого простого решения Ruby (или RubyMotion, в моем случае) просто используйте это:

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"

Однако он обрабатывает только простые хеши.

0 голосов
/ 11 января 2011

То, как rails обрабатывает строки запроса такого типа, означает, что вам нужно накатить собственное решение, как и вы. Несколько неудачно, если вы имеете дело с приложениями, не относящимися к rails, но имеет смысл, если вы передаете информацию в и из приложений rails.

...