これが私のコードです:
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で同じコードを実行すると、期待どおりに機能します。
私は何が間違っているのですか?
問題は、各メソッドを使用して文字列を作成していることです。必要なのは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>
問題は、puts
がnilを返すことです。
あなたがしたいことは:
@test2 = ""
@test2 = records_hash.each { |k,v| s<< "#{k} is #{v}" }
または同様のもの。
編集:コードサンプルで@test2
に割り当てているのは、.each
ブロックの戻り値です。
変数に割り当てるのではなく、ビューに配置することもできます。