Ruby将散列更改为带方括号的单层

fquxozlt  于 11个月前  发布在  Ruby
关注(0)|答案(2)|浏览(98)

我有一个散列,我发现,与net/http张贴我必须转换成一个平面格式。
例如

invoice = { :no => "100", :date => "08/08/2022", :client => {:name => "Foo" } }

将成为

params = { "invoice[no]" => "100", "invoice[date]" => "08/08/2022", "invoice[client][name]" => "Foo" }

有没有办法自动做到这一点?我试过_param & to_query,flatten和encode_www_form,但他们没有将其转换为所需的格式。
我正在做的post操作是一个Ruby On Rails后端,我使用Devise Tokens进行授权。

res = Net::HTTP.post_form(uri, params)
fafcakar

fafcakar1#

你需要CGI.parse方法。它将HTTP查询字符串解析为键=>值对的散列

CGI.parse({ invoice: invoice }.to_query)

# => {"invoice[client][name]"=>["Foo"], "invoice[date]"=>["08/08/2022"], "invoice[no]"=>["100"]

不要把单元素数组当作值。它会工作得很好

params = CGI.parse({ invoice: invoice }.to_query)
res = Net::HTTP.post_form(uri, params)
oxf4rvwz

oxf4rvwz2#

我认为这个片段应该做的工作:

invoice = { :no => "100", :date => "08/08/2022", :client => {:name => "Foo" } }

CGI.unescape({invoice:}.to_query)
   .split('&')
   .map{ |p| p.split('=') }
   .to_h

{"invoice[client][name]"=>"Foo", "invoice[date]"=>"08/08/2022", "invoice[no]"=>"100"}

首先,我们让ActiveRecord使用方法to_query从散列生成类似查询的结构。我们需要在之后取消转义查询字符串,因为我们不希望在那里有URL编码的输出。然后,我们使用split('&')按参数拆分字符串,并使用split('=')将每个参数拆分为键值。最后,我们将输出转换回哈希。

相关问题