Это довольно просто с простым хэшем
{:a => "a", :b => "b"}
что бы перевести на
"a=a&b=b"
Но что вы делаете с чем-то более сложным, как
{:a => "a", :b => ["c", "d", "e"]}
который должен перевести на
"a=a&b[0]=c&b[1]=d&b[2]=e"
Или еще хуже (что делать) с чем-то вроде:
{:a => "a", :b => [{:c => "c", :d => "d"}, {:e => "e", :f => "f"}]
Спасибо за очень ценную помощь с этим!
ruby
http
parameters
hashmap
Жюльен Дженесту
источник
источник
Ответы:
Обновление: эта функциональность была удалена из драгоценного камня.
Жюльен, твой самоотверженный ответ хороший, и я бесстыдно позаимствовал его, но он не избегает зарезервированных символов, и есть несколько других крайних случаев, когда он ломается.
Драгоценный камень « адресуемый »
источник
query_values
мутатора.Для базовых, не вложенных хэшей, Rails / ActiveSupport имеет
Object#to_query
.http://api.rubyonrails.org/classes/Object.html#method-i-to_query
источник
require 'active_support/all'
нуженto_query
неправильно обрабатываются значения nil.{ a: nil, b: '1'}.to_query == "a=&b=1"
, но Rack и CGI оба разбираютсяa=
как пустая строка, а неnil
. Я не уверен насчет поддержки других серверов, но с рельсами правильная строка запроса должна бытьa&b=1
. Я думаю, что это неправильно, что Rails не может создать строку запроса, которая сама себя правильно анализирует ...Если вы используете Ruby 1.9.2 или новее, вы можете использовать его,
URI.encode_www_form
если вам не нужны массивы.Например (из документов по Ruby в 1.9.3):
Вы заметите, что значения массива не устанавливаются с именами ключей, содержащимися так,
[]
как мы все привыкли в строках запроса. Используемая спецификацияencode_www_form
соответствует определениюapplication/x-www-form-urlencoded
данных HTML5 .источник
{:c => "c", :d => true}
кажется, что хеш проверяется, поэтому передается в виде строки.ruby -ruri -e 'puts RUBY_VERSION; puts URI.encode_www_form({:a => "a", :b => {:c => "c", :d => true}, :e => []})' # outputs 2.0.0 a=a&b=%7B%3Ac%3D%3E%22c%22%2C+%3Ad%3D%3Etrue%7D&
Addressable::URI
и ActiveSupportObject#to_query
.Не нужно загружать раздутый ActiveSupport или свернуть свой собственный, вы можете использовать
Rack::Utils.build_query
иRack::Utils.build_nested_query
. Вот сообщение в блоге, которое дает хороший пример:Он даже обрабатывает массивы:
Или более сложные вложенные вещи:
источник
:b
это массив из двух хешей. В итоге:b
получается массив из одного большего хэша.require 'rack'
? Это должно быть там, учитывая, что все основные веб-фреймворки Ruby теперь созданы поверх Rack.to_query
также объединяет 2 массива (v4.2).Украсть у Merb:
См. Http://noobkit.com/show/ruby/gems/development/merb/hash/to_params.html.
источник
Вот короткая и приятная строка, если вам нужно только поддерживать простые строки запроса ключа / значения ASCII:
источник
источник
Вот другой способ. Для простых запросов.
источник
Я знаю, что это старый вопрос, но я просто хотел опубликовать этот фрагмент кода, так как я не смог найти простой гем, который бы выполнил для меня только эту задачу.
Свернутый как драгоценный камень здесь: https://github.com/simen/queryparams
источник
URI.escape != CGI.escape
а для URL вы хотите первый.CGI.escape("http://localhost/search?q=banana&limit=7")
=> "http%3A%2F%2Flocalhost%2Fsearch%3Fq%3Dbanana%26limit%3D7"
URI.escape("http://localhost/search?q=banana&limit=7")
=> "http://localhost/search?q=banana&limit=7"
Лучший подход - использовать Hash.to_params, который отлично работает с массивами.
источник
require 'active_support/all'
нуженЕсли вы находитесь в контексте запроса Фарадея, вы также можете просто передать хэш params в качестве второго аргумента, и Фарадей позаботится о том, чтобы сделать из него правильный URL-адрес param:
источник
Мне нравится использовать этот драгоценный камень:
https://rubygems.org/gems/php_http_build_query
Пример использования:
источник
источник