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

追記

壮大な勘違いだった.ちゃんと読んでない俺が悪ぅございました.
なんと,ハッシュではなく配列だそうで.・・・はぅぁあぁ.