[英]Rails flat params to hash
我在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"
}
将其转换为明显的哈希的最有效方法是什么?
理想的方法是更改参数以反映所需的结构。 对于应嵌套在哈希中的参数,例如shopping-cart.items.item-1.item-name
,请将参数shopping-cart.items.item-1.item-name
更改为shopping-cart[items][item-1][item-name]
。 然后,rails将为您完成工作。
尝试这个:
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
结尾的键中。 不知何故,此购物车哈希没有合理的结构...
请享用!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.