我在Rails 3中有这个POST param (来自Google购物车脚本)。
{
"shopping-cart.items.item-1.item-name"=>"Item one",
"shopping-cart.items.item-1.item-description"=>"An item",
"shopping-cart.items.item-1.unit-price"=>"10",
"shopping-cart.items.item-1.unit-price.currency"=>"GBP",
"shopping-cart.items.item-1.quantity"=>"1",
"shopping-cart.items.item-2.item-name"=>"Item two",
"shopping-cart.items.item-2.item-description"=>"Another item",
"shopping-cart.items.item-2.unit-price"=>"12.5",
"shopping-cart.items.item-2.unit-price.currency"=>"GBP",
"shopping-cart.items.item-2.quantity"=>"3",
"shopping-cart.items.item-3.item-name"=>"Item three",
"shopping-cart.items.item-3.item-description"=>"Yet another item",
"shopping-cart.items.item-3.unit-price"=>"20",
"shopping-cart.items.item-3.unit-price.currency"=>"GBP",
"shopping-cart.items.item-3.quantity"=>"2",
"edit_url"=>"http://somerailsapp/store/buy",
"_charset_"=>"UTF-8",
"controller"=>"order",
"action"=>"process"
}
将此转换为明显哈希的最有效方法是什么?
答案 0 :(得分:1)
理想的方法是更改参数以反映所需的结构。对于应嵌套在哈希中的参数(例如shopping-cart.items.item-1.item-name
),请将参数名称更改为shopping-cart[items][item-1][item-name]
。然后rails会为你完成工作。
答案 1 :(得分:0)
试试这个:
params.map { |k,v| [k.split('.').reverse,v] }.map { |keys,val| keys.inject(val) { |val, e| { e => val }} }.inject({}) { |hsh, h| hsh.deep_merge(h) }
这可能不是最佳方式,但是 - 除非我们在讨论购物车中的数百万件商品 - 它仍然比单个数据库查询更快地完成工作。
对于样本参数,结果应为:
{"shopping-cart"=>{"items"=>{"item-1"=>{"item-name"=>"Item one", "item-description"=>"An item", "unit-price"=>{"currency"=>"GBP"}, "quantity"=>"1"}, "item-2"=>{"item-name"=>"Item two", "item-description"=>"Another item", "unit-price"=>{"currency"=>"GBP"}, "quantity"=>"3"}, "item-3"=>{"item-name"=>"Item three", "item-description"=>"Yet another item", "unit-price"=>{"currency"=>"GBP"}, "quantity"=>"2"}}}, "edit_url"=>"http://somerailsapp/store/buy", "_charset_"=>"UTF-8", "controller"=>"order", "action"=>"process"}
您也可以使用
k.split('.').reverse.map { |k| sanitize_key(k) }
其中sanitize_key
删除item-
前缀和/或将项目编号更改为整数。
编辑:我刚注意到价格不见了 - 所以您可能想要将'.amount'
添加到
以unit-price
结尾的键。不知怎的,这个购物车哈希结构不是很明智......
享受!