簡體   English   中英

Ruby 將 hash 更改為單層,帶方括號

[英]Ruby change hash to single layer with square brackets

我有一個 hash 並且我發現通過 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" }

有沒有辦法自動做到這一點? 我嘗試過 to_param & to_query、flatten 和 encode_www_form,但他們沒有將其轉換為這種所需的格式。

我正在做的發布操作是到 Ruby On Rails 后端,我使用 Devise 令牌進行授權。

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

你需要CGI.parse方法。 它將 HTTP 查詢字符串解析為鍵 => 值對的 hash

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

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

不要關心單元素 arrays 作為值。 它會運作良好

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

我認為這個片段應該可以完成這項工作:

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 方法從to_query生成類似查詢的結構。 之后我們需要取消對查詢字符串的轉義,因為我們不想在那里有 URL 編碼的 output。 之后,我們使用split('&')按參數拆分字符串,並使用split('=')每個參數拆分為鍵值。 最后,我們將 output 轉換回 hash。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM