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
Вы можете просто поместить это в свое мнение, а не назначать его переменной.