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

source: https://github.com/rack/rack/blob/b172805895fc0490bf81e942487233e6771f4643/lib/rack/query_parser.rb#L68-L87

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"]}

参考