web-dev-qa-db-ja.com

Ruby on Rails:hash.each {}の問題

これが私のコードです:

records_hash = records[:id].inject({}) { |result,h|
  if result.has_key?(h)
    result[h] += 1
  else
    result[h] = 1
  end
  result
}

@test2 = records_hash.each{|key,value| puts "#{key} is #{value}"}

私の出力は次のようになります。

bozo is 3
bubba is 4
bonker is 5

ただし、ページに表示されます(<%= @test2 %>)このように:

bozo3bubba4bonker5

同様のブロックで.each_keyと.each-valueを試しましたが、すべて上記の同じ文字列を返します。 IRBで同じコードを実行すると、期待どおりに機能します。

私は何が間違っているのですか?

15
neezer

問題は、各メソッドを使用して文字列を作成していることです。必要なのはmapメソッドです。各メソッドはハッシュを返し、mapはブロックの値を返します。

あなたはこのようなものが欲しいです:

@test2 = records_hash.map { |k,v| "#{k} is #{v}" }

また、単純な文字列でない限り、このようなビューコードを作成するべきではありません。あなたの例は、各行にそれぞれ固有の要素が必要であることを示しています。したがって、ビューは次のようになります。

<% @records_hash.each do |k,v| %>
<%= "#{k} is #{v}" %>
<% end -%>

ビューがHTMLビューの場合は、各行の間に区切り文字も必要になります。

<% @records_hash.each do |k,v| %>
<%= "#{k} is #{v}" %><br/>
<% end -%>

または

<ul>
  <% @records_hash.each do |k,v| %>
  <li><%= "#{k} is #{v}" %></li>
  <% end -%>
</ul>
40
Samuel

問題は、putsがnilを返すことです。

あなたがしたいことは:

@test2 = ""
@test2 = records_hash.each { |k,v| s<< "#{k} is #{v}" }

または同様のもの。

編集:コードサンプルで@test2に割り当てているのは、.eachブロックの戻り値です。

1
Matt Haley

変数に割り当てるのではなく、ビューに配置することもできます。

0
dylanfm