2021-04-13 RubyでStringをQueryParamとして解釈(CGI.parse / Rack::Utils.parse_nested_query)
CGI.parse
require "cgi"
params = CGI.parse("query_string")
# {"name1" => ["value1", "value2", ...],
# "name2" => ["value1", "value2", ...], ... }
ref. CGI.parse (Ruby 3.2 リファレンスマニュアル)
試してみる
CGI.parse("query_string") #=> {"query_string"=>[]}
CGI.parse("") #=> {}
CGI.parse("query_string=1") #=> {"query_string"=>["1"]}
# 値はマージされる
CGI.parse("query_string=1&query_string=2") #=> {"query_string"=>["1", "2"]}
# キーが違えば値はマージされない
CGI.parse("query_string=1&query_string2=2") #=> {"query_string"=>["1"], "query_string2"=>["2"]}
- Hash valueは基本的に Array の形式になる
{ <String> => <Array> }
- 複数のKeyが定義されている場合は値がマージされる
{"query_string"=>["1", "2"]}
Rack::Utils.parse_nested_query
Rack::Utils.parse_nested_query("a=1&b=2") #=> {"a"=>"1", "b"=>"2"}
Rack::Utils.parse_nested_query("") #=> {}
# 後勝ち
Rack::Utils.parse_nested_query("a=1&a=2") #=> {"a"=>"2"}
# Array化する
Rack::Utils.parse_nested_query("a[]=1&a[]=2") #=> {"a"=>["1", "2"]}
Rack::Utils.parse_nested_query("a[]=1&a[][x]=2") #=> {"a"=>["1", {"x"=>"2"}]}
- 同じキーでvalueをセットしたときに後勝ちになる
"a=1&a=2"
→{"a"=>"2"}
- Array 化したければ Brackets
[]
を使うとよいa[]=1&a[]=2"
→{"a"=>["1", "2"]}