on Rails : ライド・オン・Railsのリスト21に対する疑問
ちょっとわからない.
Chapter2 P69 リスト21
class GoodsController < ApplicationController ... def update_cart @cart = session[:cart] @cart.each do |assoc| item, count = assoc count = params[item.id.to_s].to_i assoc[1] = count end redirect_to :action => 'cart' end ... end
見たまんま,ショッピングカートを更新するアクション.セッションのカートを読み込んで,カートのそれぞれの要素の数量をparamsのそれをもとに更新すると言うだけの,ただそれだけのアクション.
でもこれ,eachでぐるぐる回しただけでカートの中身って変わるっけ?以下考察.
とりあえずirbで試す.
$ irb irb(main):001:0> hoge = {'abcd' => 1, 'abc' => 2, 'ab' => 3, 'a' => 4} => {"a"=>4, "ab"=>3, "abc"=>2, "abcd"=>1}
まずはハッシュを用意.これのvalueを更新できれば嬉しいな,ってことですよね?
irb(main):002:0> hoge.each{|assoc| irb(main):003:1* key, value = assoc irb(main):004:1> value = key.length irb(main):005:1> assoc[1] = value irb(main):006:1> } => {"a"=>4, "ab"=>3, "abc"=>2, "abcd"=>1} irb(main):007:0> hoge => {"a"=>4, "ab"=>3, "abc"=>2, "abcd"=>1}
やってる事は(だいたい)同じはず.なんだけど,更新されていない.ぶっちゃけ,よろしくないような気がする/:(
正直,こういう感じで良いと思う.
irb(main):008:0> hoge.each_key{|key| irb(main):009:1* hoge[key] = key.length irb(main):010:1> } => {"a"=>1, "ab"=>2, "abc"=>3, "abcd"=>4} irb(main):011:0> hoge => {"a"=>1, "ab"=>2, "abc"=>3, "abcd"=>4}
結果,update_cartはこうすれば動きそうって感じはする.
class GoodsController < ApplicationController ... def update_cart @cart = session[:cart] @cart.each_key do |item| @cart[item] = params[item.id.to_s].to_i end redirect_to :action => 'cart' end ... end
まだ動かしてないから何とも言えないけど.
てゆーか他にもこの本,不思議だなぁと思ったのが,なんでadd_to_cartよりも先にupdate_cartなんだろうって点.やっぱり,まずはカートに商品を入れる様が知りたいんだけどなぁ.最後にadd_to_cartを実装して,一気に色んなアクションを試すってのは,イテレーションとはチョットずれてる気がしたもので.そんな風に感じるのはボクだけだったりして:p
追記
壮大な勘違いだった.ちゃんと読んでない俺が悪ぅございました.
なんと,ハッシュではなく配列だそうで.・・・はぅぁあぁ.