Почему я получаю объекты nil, повторяющие массив в шаблоне ERB? - PullRequest
0 голосов
/ 24 ноября 2010

Я новичок в Ruby и сейчас пытаюсь провести несколько экспериментов.

Я запутался в этих скриптах:

<%=@myworlds[2].topic%>

и

<% id = 1 %>
<%=@myworlds[id+1].topic%>

@mywodrld - это экземпляр модели, а topic - это поле.При выполнении первого, программа работает правильно.Когда я запускаю второй скрипт, я получаю следующую ошибку:

You have a nil object when you didn't expect it!
The error occurred while evaluating nil.topic

Что вызывает объект nil?

Ответы [ 5 ]

4 голосов
/ 24 ноября 2010

Когда я пробую ваш подход, я не могу воспроизвести вашу проблему.Он отлично работает для меня.Я предполагаю, что вы можете использовать переменную id где-то еще и что при вызове @myworlds [id + 1] .topic id имеет другое значение.Но, как я уже сказал, только предположение.

Однако я рекомендую использовать другой синтаксис при циклическом просмотре коллекций моделей в Ruby.Попробуйте что-то вроде этого:

<% @myworlds.each do |myworld| %>
  <h1><%= myworld.topic %></h1>
<% end %>

И если вам действительно нужно значение итератора, вы всегда можете использовать:

<% @myworlds.each_with_index do|myworld, i| %>

Где я отслеживаю текущий индекс вмассив.Еще одна полезная вещь - это то, что id больше не существует в памяти после окончания блока.

1 голос
/ 24 ноября 2010

Вы уверены, что у вас нет других различий между этими двумя фрагментами кода?

В своем комментарии вы говорите, что у вас есть @myworlds[@id+1], в исходном вопросе вы говорите @myworlds[id+1] (локальная переменная против экземплярапеременная).Вы можете показать точный код?

Оба сценария в порядке.Вы можете создавать переменные в одном <% %> блоке и использовать их в другом (конечно, если они находятся в одном файле .erb).

В сообщении об ошибке говорится, что в вашем массиве нет элементас индексом @id+1 или id+1.Вы должны отладить значение выражения, используемого для индекса.Я предполагаю, что где-то есть небольшая ошибка, например, опечатка.

Каков вывод вашего оператора debug(@myworlds[@id+1]), когда @myworlds[@id+1].topic вызывает ошибку?

Также попробуйте отладить значениеиз id:

<code><pre>The id = <%= debug(id) %> (<%= id.inspect %>)

(В зависимости от вашей версии Rails вы можете использовать h( id.inspect ))

0 голосов
/ 24 ноября 2010

Похоже, вы зацикливаетесь на массиве, но, возможно, используете цикл for или while для его выполнения вместо использования [].each. Ваш пример кода не дает нам достаточно информации для работы, поэтому мы стреляем в темноте, пытаясь помочь вам.

Создание индекса вручную, а затем обход массива приводит к проблемам, когда вы либо пропускаете первый или последний элемент, либо заходите слишком далеко и получаете сообщение об ошибке, которую видите. Поскольку each возвращает только элементы в массиве, он не может этого сделать.

Что-то вроде этого может работать лучше:

<% @myworlds.each do |world| %>
  ...
  <%= world.topic %>
<% end %>

Я не видел ответа, который дал @DanneManne, до того, как написал свой ответ. Я думаю, что у него есть правильное решение.

0 голосов
/ 24 ноября 2010

Я думаю, я знаю, как решить проблему.Вы пытаетесь каждый массив данных из модели, но вы используете параметр [@id+1].Неважно, «id» является глобальной или локальной переменной, но проблема в конце массива, нет массива с индексом «id+1».Вы должны добавить еще один параметр, чтобы предотвратить нераспознанный параметр.

Попробуйте это

if((@myworlds.length-1) > @id)
    @id = @id+1
end

: D

0 голосов
/ 24 ноября 2010

Я предполагаю, но по какой-то причине id+1, вероятно, не равно 2.

Чтобы проверить значение id+1, вы можете сделать это:

raise (id+1).inspect

Проверитьочень полезно, если вы хотите увидеть, что находится в объекте:)

...