ruby - при вычислении nil произошла ошибка. [] = ... как выполнить итерацию по многомерному массиву - PullRequest
0 голосов
/ 04 января 2012

У меня есть многомерный массив с именем my_ids_and_names
Вероятно, он должен быть хешем, но давайте пока оставим его в виде массива:)

Я создаю его с помощью: my_own_array = Array.new[10],[2]

У меня есть переменная @my_ids, у которой есть идентификаторы, которые я хочу.

Я заполняю ее методом, подобным этому:

# Setup
@my_ids_and_names = Array.new[10],[2]
@my_ids.each do |cid|
  @my_ids_and_names[cid][1] = my_id
  @my_ids_and_names[cid][2] = MyModel.find(my_id).internal_name
end
@my_ids_and_names

Теперь я хочу получить информацию в представлениях.
Я пытаюсь:

<% @campaign_ids_and_names.each do |cid, nm| %>
  "various bits of code..."
  var_for_id = cid
  var_for_nm = nm
<% end %>

Будут ли правильно установлены cid и nm?

Я хочу, чтобы цикл мог выдавать cid / имена как в

id  name
4   brick
9   tile
45  grout

Прямо сейчас я получаю The error occurred while evaluating nil.[]= в setup

1 Ответ

4 голосов
/ 04 января 2012

Если вы запустите консоль irb, вы увидите, что Array.new[10],[2] не создает требуемый массив, а создает следующий массив:

[nil, [2]]

Если вы хотите создать новый массив с 10 элементами массива, используйте следующий конструктор:

Array.new(10, [])

Обновление 1

Но, читая ваш вопрос далее, я вижу, что вам нужен Hash вместо Array, и вы должны помнить, что ruby ​​начинает индексировать с 0 вместо 1.

Итак:

@my_ids_and_names = Hash.new
@my_ids.each do |cid|
  @my_ids_and_names[cid] = Array.new
  @my_ids_and_names[cid][0] = my_id
  @my_ids_and_names[cid][1] = MyModel.find(my_id).internal_name
end
@my_ids_and_names

Что может быть дополнительно упрощено до:

@my_ids_and_names = {}
@my_ids.each do |cid|
  @my_ids_and_names[cid] = [ my_id, MyModel.find(my_id).internal_name ]
end
@my_ids_and_names

Обновление 2

Но это не сработает с вашим each циклом, который вы предоставили, поэтому я бы использовал следующий код:

@my_ids_and_names = {}
@my_ids.each do |cid|
  @my_ids_and_names[cid] = MyModel.find(my_id).internal_name
end
@my_ids_and_names

Это создаст Hash с cid клавишами и internal_name из MyModels в качестве значений.

...