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) }

これは最適な方法ではないかもしれませんが、カート内の何百万ものアイテムについて話している場合を除き、単一の DB クエリよりも高速に処理されます。

サンプル パラメータの場合、結果は次のようになります。

{"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。どういうわけか、このカートのハッシュはきちんと構造化されていません...

楽しみ!

于 2013-02-21T18:05:44.430 に答える