Saya memiliki beberapa URL, seperti
http://www.example.com/something?param1=value1¶m2=value2¶m3=value3
dan saya ingin mengekstrak parameter dari URL ini dan memasukkannya ke dalam Hash. Jelas, saya bisa menggunakan ekspresi reguler, tetapi saya hanya ingin tahu apakah ada cara yang lebih mudah untuk melakukannya dengan Ruby atau Rails. Saya belum menemukan apa pun di modul Ruby URI
tetapi mungkin saya melewatkan sesuatu.
Sebenarnya, saya membutuhkan metode yang akan melakukannya:
extract_parameters_from_url("http://www.example.com/something?param1=value1¶m2=value2¶m3=value3")
#=> {:param1 => 'value1', :param2 => 'value2', :param3 => 'value3'}
Apakah Anda punya nasihat?
ruby-on-rails
ruby
uri
url-parameters
Flackou
sumber
sumber
Hash[*string.split('&').collect{|i|i.split('=')}.flatten]
Ini akan berhasil juga, tapi mungkin itu pilihan terburuk untuk kasus ini. Tapi tetap saja Anda mungkin menganggap cuplikan ini menarik. (Posting sebagai komentar karena saya tidak menganggap ini sebagai jawaban :-))Jawaban:
Saya pikir Anda ingin mengubah string URL apa pun menjadi HASH?
Anda dapat mencoba http://www.ruby-doc.org/stdlib/libdoc/cgi/rdoc/classes/CGI.html#M000075
require 'cgi' CGI::parse('param1=value1¶m2=value2¶m3=value3')
kembali
{"param1"=>["value1"], "param2"=>["value2"], "param3"=>["value3"]}
sumber
CGI.parse(URI.parse(url).query)
CGI::parse(URI::parse(url).query)
Saya menemukan diri saya membutuhkan hal yang sama untuk proyek baru-baru ini. Berdasarkan solusi Levi's, inilah metode yang lebih bersih dan lebih cepat:
Rack::Utils.parse_nested_query 'param1=value1¶m2=value2¶m3=value3' # => {"param1"=>"value1", "param2"=>"value2", "param3"=>"value3"}
sumber
param1=value1¶m1=value2
. Nilai kedua mengalahkan nilai pertama.Rack::Utils.build_nested_query(params)
(atauRack::Utils.build_query(params)
jika diurai denganRack::Utils.parse_query
).Baru saja ditingkatkan dengan jawaban Levi di atas -
Rack::Utils.parse_query URI("http://example.com?par=hello&par2=bye").query
Untuk string seperti url di atas, itu akan kembali
{ "par" => "hello", "par2" => "bye" }
sumber
Rack::Utils.build_query(params)
.Untuk solusi Ruby murni menggabungkan
URI.parse
denganCGI.parse
(ini dapat digunakan bahkan jika Rails / Rack dll tidak diperlukan):CGI.parse(URI.parse(url).query) # => {"name1" => ["value1"], "name2" => ["value1", "value2", ...] }
sumber
Ada lebih dari satu cara, untuk menyelesaikan masalah Anda. Orang lain telah menunjukkan beberapa trik. Saya tahu trik lain. Inilah percobaan saya: -
require 'uri' url = "http://www.example.com/something?param1=value1¶m2=value2¶m3=value3" uri = URI(url) # => #<URI::HTTP:0x89e4898 URL:http://www.example.com/something?param1=value1¶m2=value2¶m3=value3> URI::decode_www_form(uri.query).to_h # if you are in 2.1 or later version of Ruby # => {"param1"=>"value1", "param2"=>"value2", "param3"=>"value3"} Hash[URI::decode_www_form(uri.query)] # if you are below 2.1 version of Ruby # => {"param1"=>"value1", "param2"=>"value2", "param3"=>"value3"}
Bacalah dokumentasi metode
::decode_www_form
.sumber
Lihat permata yang dapat dialamatkan - pengganti populer untuk modul URI Ruby yang membuat penguraian kueri menjadi mudah:
require "addressable/uri" uri = Addressable::URI.parse("http://www.example.com/something?param1=value1¶m2=value2¶m3=value3") uri.query_values['param1'] => 'value1'
(Ini juga tampaknya menangani encoding / decoding param, tidak seperti URI)
sumber
Di Controller Anda, Anda seharusnya bisa mengakses kamus (hash) yang dipanggil
params
. Jadi, jika Anda tahu nama setiap parameter kueri, lakukan sajaparams[:param1]
untuk mengaksesnya ... Jika Anda tidak tahu apa nama parameternya, Anda dapat menelusuri kamus dan mendapatkan kuncinya.Beberapa contoh sederhana di sini .
sumber