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

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

>>> 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, Есть ли правильный или лучший способ сделать это?

 Charlie11 янв. 2011 г., 08:08
Я виделbit.ly/gc2Ylj, что побудило меня быстро написатьgist.github.com/774142который ядумать выполняет то, что я хочу. Хотя то, что я хотел, былоне свернуть свое. :-)

Ответы на вопрос(5)

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

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

# => "http://www..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"]} 
 gorn01 янв. 2019 г., 00:46
to_query это стандартный метод или рубиновый хэш?

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

require 'uri'
URI.encode_www_form(hash)
 Jordan Stewart22 нояб. 2016 г., 02:15
Вот документация для stdlib-2.1.0:ruby-doc.org/stdlib-2.1.0/libdoc/uri/rdoc/...

в моем случае) просто используйте это:

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"

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

require 'uri'
def hash_to_query(hash)
  return URI.encode(hash.map{|k,v| "#{k}=#{v}"}.join("&"))
end
 aidan31 авг. 2018 г., 05:13
Не используйте это. Это потерпит неудачу, если какой-либо ключ или значение содержит= или же&
 Aaron Jensen04 дек. 2015 г., 18:59
Это неправильно экранирует ключи или значения.
 mrudult13 нояб. 2015 г., 14:10
Это сортирует ключи в алфавитном порядке

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

Ваш ответ на вопрос