Itu cukup mudah dengan hash seperti biasa
{:a => "a", :b => "b"}
yang akan diterjemahkan menjadi
"a=a&b=b"
Tetapi apa yang Anda lakukan dengan sesuatu yang lebih kompleks seperti
{:a => "a", :b => ["c", "d", "e"]}
yang harus diterjemahkan menjadi
"a=a&b[0]=c&b[1]=d&b[2]=e"
Atau bahkan lebih buruk, (apa yang harus dilakukan) dengan sesuatu seperti:
{:a => "a", :b => [{:c => "c", :d => "d"}, {:e => "e", :f => "f"}]
Terima kasih atas bantuan yang sangat kami hargai!
ruby
http
parameters
hashmap
Julien Genestoux
sumber
sumber
Jawaban:
Memperbarui: Fungsi ini telah dihapus dari permata.
Julien, jawaban-dirimu bagus, dan aku tidak tahu malu meminjamnya, tapi itu tidak benar-benar lepas dari karakter yang dilindungi, dan ada beberapa kasus tepi lain di mana ia rusak.
Permata itu 'bisa dialamatkan '
sumber
query_values
mutator.Untuk hash dasar, non-bersarang, Rails / ActiveSupport miliki
Object#to_query
.http://api.rubyonrails.org/classes/Object.html#method-i-to_query
sumber
require 'active_support/all'
diperlukanto_query
tidak menangani nilai nil dengan benar.{ a: nil, b: '1'}.to_query == "a=&b=1"
, tapi Rack dan CGI keduanya parsea=
sebagai string kosong, bukannil
. Saya tidak yakin tentang dukungan untuk server lain, tetapi dengan rel, string kueri yang benar seharusnyaa&b=1
. Saya pikir itu salah bahwa Rails tidak dapat menghasilkan string kueri yang diuraikan dengan benar dengan sendirinya ...Jika Anda menggunakan Ruby 1.9.2 atau lebih baru, Anda dapat menggunakan
URI.encode_www_form
jika Anda tidak membutuhkan array.Misalnya (dari dokumen Ruby di 1.9.3):
Anda akan melihat bahwa nilai-nilai array tidak disetel dengan nama-nama kunci yang mengandung
[]
seperti kita semua sudah terbiasa dengan string kueri. Spesifikasi yangencode_www_form
digunakan sesuai dengan definisiapplication/x-www-form-urlencoded
data HTML5 .sumber
{:c => "c", :d => true}
tampaknya diperiksa, jadi dikirim sebagai string.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
dan ActiveSupportObject#to_query
.Tidak perlu memuat ActiveSupport yang kembung atau menggulung sendiri, Anda dapat menggunakan
Rack::Utils.build_query
danRack::Utils.build_nested_query
. Berikut ini posting blog yang memberikan contoh yang baik:Bahkan menangani array:
Atau hal-hal yang lebih sulit:
sumber
:b
adalah array dari dua hash. Anda berakhir dengan:b
menjadi array hash yang lebih besar.require 'rack'
? Itu harus ada di sana, mengingat semua kerangka kerja Ruby utama dibangun di atas Rak sekarang.to_query
juga menggabungkan 2 array (v4.2).Mencuri dari Merb:
Lihat http://noobkit.com/show/ruby/gems/development/merb/hash/to_params.html
sumber
Berikut ini adalah kalimat singkat dan manis jika Anda hanya perlu mendukung string kueri / nilai ASCII sederhana:
sumber
sumber
Ini cara lain. Untuk pertanyaan sederhana.
sumber
Saya tahu ini adalah pertanyaan lama, tetapi saya hanya ingin memposting sedikit kode ini karena saya tidak dapat menemukan permata sederhana untuk melakukan tugas ini untuk saya.
Digulung sebagai permata di sini: https://github.com/simen/queryparams
sumber
URI.escape != CGI.escape
dan untuk URL Anda ingin yang pertama.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"
Pendekatan terbaik adalah dengan menggunakan Hash.to_params yang merupakan yang berfungsi baik dengan array.
sumber
require 'active_support/all'
diperlukanJika Anda berada dalam konteks permintaan Faraday, Anda juga bisa meneruskan hash params sebagai argumen kedua dan faraday menangani pembuatan bagian URL yang tepat darinya:
sumber
Saya suka menggunakan permata ini:
https://rubygems.org/gems/php_http_build_query
Penggunaan sampel:
sumber
sumber