1

我在 Rails 3 中有这个 POST参数(来自 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"
}

将其转换为明显哈希的最有效方法是什么?

4

2 回答 2

1

理想的方法是更改​​参数以反映您想要的结构。对于应该嵌套在哈希中的参数,例如shopping-cart.items.item-1.item-name,将参数的名称更改为shopping-cart[items][item-1][item-name]。然后,rails 将为您完成工作。

于 2013-02-21T16:26:51.607 回答
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) }

wheresanitize_key去掉item-前缀和/或将项目编号更改为整数。

编辑:我刚刚注意到价格不见了 - 所以你可能想添加'.amount'以 . 结尾的键unit-price。不知何故,这个购物车哈希的结构并不健全......

享受!

于 2013-02-21T18:05:44.430 回答