![](/img/trans.png)
[英]convert ruby hash to URL query string … without those square brackets
[英]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.