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-значение с похожими блоками, и все они возвращают одну и ту же строку выше. Я запускаю тот же код в IRB, и он работает как ожидалось.

Что я делаю неправильно?

Ответы

Ответ 1

Ваша проблема в том, что вы используете каждый метод для создания своей строки. То, что вы хотите, - это метод карты. каждый метод возвращает хеш, а карта возвращает значение блока.

Вы хотите что-то вроде этого:

@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>

Ответ 2

Проблема заключается в том, что puts возвращает nil.

Что вы хотите сделать:

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

или что-то подобное.

Изменить: то, что вы назначаете @test2 в своем примере кода, является возвращаемым значением блока .each.

Ответ 3

Вы можете просто поместить это в свое мнение, а не назначать его переменной.