To jest całkiem proste z prostym hash
{:a => "a", :b => "b"}
co przełożyłoby się na
"a=a&b=b"
Ale co robisz z czymś bardziej złożonym, takim jak
{:a => "a", :b => ["c", "d", "e"]}
co powinno się przełożyć na
"a=a&b[0]=c&b[1]=d&b[2]=e"
Lub jeszcze gorzej (co zrobić) z czymś takim jak:
{:a => "a", :b => [{:c => "c", :d => "d"}, {:e => "e", :f => "f"}]
Dzięki za bardzo docenianą pomoc!
ruby
http
parameters
hashmap
Julien Genestoux
źródło
źródło
Odpowiedzi:
Aktualizacja: Ta funkcjonalność została usunięta z klejnotu.
Julien, twoja własna odpowiedź jest dobra, a ja bezwstydnie pożyczyłem od niej, ale nie ucieka właściwie zarezerwowanym postaciom, i jest kilka innych skrajnych przypadków, w których się psuje.
Klejnot jest „ adresowalny ”
źródło
query_values
mutatora.W przypadku podstawowych, nie zagnieżdżonych skrótów, Rails / ActiveSupport ma
Object#to_query
.http://api.rubyonrails.org/classes/Object.html#method-i-to_query
źródło
require 'active_support/all'
jest potrzebnyto_query
nie obsługuje poprawnie wartości zerowych.{ a: nil, b: '1'}.to_query == "a=&b=1"
, ale zarówno Rack, jak i CGI parsująa=
jako pusty ciąg, a nienil
. Nie jestem pewien co do obsługi innych serwerów, ale w przypadku szyn powinien być prawidłowy ciąg zapytaniaa&b=1
. Myślę, że to źle, że Railsy nie mogą wygenerować ciągu zapytania, który sam jest poprawnie parsowany ...Jeśli używasz Ruby 1.9.2 lub nowszego, możesz użyć
URI.encode_www_form
jeśli nie potrzebujesz tablic.Np. (Z Ruby docs w 1.9.3):
Zauważysz, że wartości tablic nie są ustawione z nazwami kluczy zawierającymi,
[]
jak wszyscy jesteśmy przyzwyczajeni w ciągach zapytań. Używana specyfikacjaencode_www_form
jest zgodna z definicjąapplication/x-www-form-urlencoded
danych HTML5 .źródło
{:c => "c", :d => true}
Wygląda na to, że nie działa z Ruby 2.0 - skrót wydaje się być sprawdzany, więc jest przesyłany jako ciąg znaków.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
i dla ActiveSupportObject#to_query
.Nie musisz ładować rozdętego ActiveSupport ani tworzyć własnych, możesz użyć
Rack::Utils.build_query
iRack::Utils.build_nested_query
. Oto post na blogu, który stanowi dobry przykład:Obsługuje nawet tablice:
Lub trudniejsze zagnieżdżone rzeczy:
źródło
:b
jest tablicą dwóch skrótów. W efekcie:b
powstaje tablica jednego większego skrótu.require 'rack'
? Musi tam być, biorąc pod uwagę, że wszystkie główne frameworki Ruby są teraz zbudowane na Rack.to_query
łączy także 2 tablice (v4.2).Kradnij od Merba:
Zobacz http://noobkit.com/show/ruby/gems/development/merb/hash/to_params.html
źródło
Oto krótki i słodki jeden linijka, jeśli potrzebujesz obsługiwać tylko proste ciągi zapytań klucz / wartość ASCII:
źródło
źródło
Oto inny sposób. Dla prostych zapytań.
źródło
Wiem, że to stare pytanie, ale chciałem tylko napisać ten fragment kodu, ponieważ nie mogłem znaleźć prostego klejnotu, który mógłby wykonać to zadanie dla mnie.
Zwinięte jako klejnot tutaj: https://github.com/simen/queryparams
źródło
URI.escape != CGI.escape
i dla adresu URL chcesz pierwszy.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"
Najlepszym rozwiązaniem jest użycie Hash.to_params, który działa dobrze z tablicami.
źródło
require 'active_support/all'
jest potrzebnyJeśli jesteś w kontekście żądania Faradaya, możesz również przekazać skrót params jako drugi argument i faraday zajmuje się tworzeniem z niego odpowiedniego adresu URL param:
źródło
Lubię używać tego klejnotu:
https://rubygems.org/gems/php_http_build_query
Przykładowe użycie:
źródło
źródło