Ruby on Rails: hash.each {} проблемы - PullRequest
       14

Ruby on Rails: hash.each {} проблемы

15 голосов
/ 10 января 2009

Вот мой код:

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, и он работает как положено.

Что я делаю не так?

Ответы [ 3 ]

39 голосов
/ 10 января 2009

Ваша проблема в том, что вы используете каждый метод для построения вашей строки. То, что вы хотите, это метод карты. каждый метод возвращает хеш, а 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>
1 голос
/ 10 января 2009

Проблема в том, что puts возвращает ноль.

То, что вы хотите сделать, это:

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

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

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

0 голосов
/ 10 января 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...