2012-03-26 5 views
1

は、私は私のコントローラのメソッドにハッシュを反復処理しようとしています:Rails 3.2.1:最後のキーと値のペアだけを取得するコントローラメソッドのハッシュを反復処理するのはなぜですか?

ビュー
@trsesh_counts.each do |trsesh_mode, trsesh_count| 
    @hash = "#{trsesh_mode} (#{trsesh_count})" 
    end 

、私はインスタンス変数@hash呼び出す:

 <% @trsesh_counts.each do |trsesh_mode, trsesh_count| %> 
      <%= "#{trsesh_mode} (#{trsesh_count})" %> 
      <% end %> 
     vs. <%= @hash %> where array = <%= @trsesh_counts %> 

次を出力します。

(7) Running (12) Weightlifting (1) vs. Weightlifting (1) where array = {""=>7, "Running"=>12, "Weightlifting"=>1} 

なぜ@hashインスタンス変数がfetcハッシュの最後のキーと値のペアのみをヒンジします(ウェイトリフティング(1))?ビューで反復するときのようにハッシュ全体を出力するにはどうすればよいですか?

何らかの理由で私は各キーと値のペアでフェッチを呼び出すことができますが、それでも各ペアを反復することはできません。

h = @trsesh_counts 
     @hash = h.fetch("Running") 

...は、「実行中」キーの値12を返します。

答えて

3

@trsesh_countsをループするたびに@hashの値を再割り当てするため、コードが機能しません。また、わかりやすくするために変数名を保存しましたが、実際には文字列でハッシュではないので、@hashの名前を変更することをおすすめします。元のコードスニペットは、これに変更します。

@hash = "" 
@trsesh_counts.each do |trsesh_mode, trsesh_count| 
    @hash << "#{trsesh_mode} (#{trsesh_count}) " 
end 

注空の文字列、各ブロック内<<の使用に@hash = ""の初期割り当て。 (私は文字列の値に後続のスペースも含めました)。これは、各繰り返しで新しい値を再割り当てするのではなく、@hashの値を構築します。

また、これは、そうのようEnumerable#each_with_objectを使用して短縮することができる。

@hash = @trsesh_counts.each_with_object("") { |ary, str| str << "#{ary[0]} (#{ary[1]}) " } 
関連する問題