Rails flat params哈希

时间:2013-02-21 16:02:54

标签: ruby-on-rails ruby ruby-on-rails-3 parameters ruby-on-rails-3.2

我在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"
}

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

2 个答案:

答案 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结尾的键。不知怎的,这个购物车哈希结构不是很明智......

享受!