Rails 3.2.1: почему перебирает хеш в методе контроллера, выбирая только последнюю пару ключ-значение? - PullRequest
1 голос
/ 26 марта 2012

Я пытаюсь перебрать хэш в моем методе контроллера :

   @trsesh_counts.each do |trsesh_mode, trsesh_count|
    @hash = "#{trsesh_mode} (#{trsesh_count})"
   end

В моем представлении я вызываю переменную экземпляра @hash:

     <% @trsesh_counts.each do |trsesh_mode, trsesh_count| %>
            <%= "#{trsesh_mode} (#{trsesh_count})" %>
            <% end %>
        vs. <%= @hash %>    where array = <%= @trsesh_counts %>

, который выводит следующее:

 (7) Running (12) Weightlifting (1) vs. Weightlifting (1) where array = {""=>7, "Running"=>12, "Weightlifting"=>1}

почему переменная экземпляра @hash извлекает только последнюю пару ключ-значение хэша (Weightlifting (1))? Как получить @hash для вывода всего хеша, как при итерации в представлении?

РЕДАКТИРОВАТЬ: по какой-то причине я могу вызвать выборку для каждой пары ключ-значение, но я все еще не могу перебрать каждую пару.

 h = @trsesh_counts
         @hash = h.fetch("Running")

... возвращает 12, значение для клавиши «Running».

1 Ответ

3 голосов
/ 25 апреля 2012

Ваш код не работает, потому что вы переустанавливаете значение @hash каждый раз, когда просматриваете @trsesh_counts. Кроме того, я сохранил имена ваших переменных для ясности, но я бы рекомендовал изменить имя @hash, поскольку это действительно строка, а не хеш. Измените свой оригинальный фрагмент кода на это:

@hash = ""
@trsesh_counts.each do |trsesh_mode, trsesh_count|
  @hash << "#{trsesh_mode} (#{trsesh_count}) "
end

Обратите внимание на начальное присвоение @hash = "" пустой строке, затем использование << внутри каждого блока. (Я также включил завершающий пробел в строковое значение.) Это создаст значение @hash вместо переназначения ему нового значения на каждой итерации.

Это также можно сократить, используя Enumerable#each_with_object примерно так:

@hash = @trsesh_counts.each_with_object("") { |ary, str| str << "#{ary[0]} (#{ary[1]}) " }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...