繁体   English   中英

Rails平面参数进行哈希处理

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM