Что означает неопределенный метод [] в рельсах? - PullRequest
0 голосов
/ 01 октября 2010

Я получаю следующую ошибку:

undefined method `[]' for nil:NilClass

Связанный фрагмент в строке 50:

 47: <%=h @contact.date_entered.to_date %></br>  
 48: Next event: 
 49: <% next_delayed_todo = @contact.next_delayed_todo %> 
 50: <% unless next_delayed_todo[:event].nil? %>
 52: <%= next_delayed_todo[:event].title %> </br>

Ответы [ 5 ]

2 голосов
/ 01 октября 2010

Это означает, что NilClass не реализует метод []. Что, в свою очередь, означает, что в вашем коде next_delayed_todo равно nil.

.nil? Теперь у вас есть проверка, если значение, возвращаемое next_delayed_todo [: event], равно nil. Вы также должны добавить нулевую проверку для next_delayed_todo

2 голосов
/ 01 октября 2010

Это означает, что вы вызвали [] для нулевого объекта.В этом случае next_delayed_todo было nil.

Вы хотите что-то более похожее: разве что next_delayed_todo.nil?||next_delayed_todo [: событие] .nil

?
1 голос
/ 01 октября 2010

Видите, как у вас есть 3 последовательных строки с ничего, кроме кода на ваш взгляд? Это признак того, что вы должны вытащить его в помощник, чтобы ваши взгляды были чистыми.

Новый код просмотра:

<%=h @contact.date_entered.to_date %></br>  
Next event: <%= next_delayed_todo(@contact) %> </br>

Тогда в вашем помощнике:

def next_delayed_todo(contact)
  contact.next_delayed_todo[:event].title rescue ""
end

Обратите внимание, что ошибка, которую вы получили, из-за того, что next_delayed_todo равен нулю. Первая строка вспомогательного метода использует rescue "" для установки альтернативного значения, если оно равно nil. Вы можете заменить его на rescue "none." или любую другую строку, которая имеет смысл.

0 голосов
/ 01 октября 2010

Я вижу ошибку в вашем коде, если только не начинается блок, в противном случае, как написано, строка ничего не делает. Так что это должно работать:

 <%=h @contact.date_entered.to_date %></br>  
 Next event: 
 <% next_delayed_todo = @contact.next_delayed_todo %> 
 <% unless next_delayed_todo[:event].nil? do %>
   <%= next_delayed_todo[:event].title %> </br>
 <% end %>
0 голосов
/ 01 октября 2010

NoMethodError: класс, производный от исключения, является исключением.В сильном динамически типизированном языке, если вы пытаетесь использовать метод для типов, для которых этот метод не существует, вы генерируете исключение неверного типа.

method_missing - это функция - http://ruby -doc.org / core/classes/Kernel.html#M005925

Вызывается Ruby при отправке obj сообщения, которое он не может обработать.Символ - это символ для вызываемого метода, а аргументы - любые аргументы, которые были переданы ему.По умолчанию интерпретатор выдает ошибку при вызове этого метода.Однако возможно переопределить метод, чтобы обеспечить более динамичное поведение.В приведенном ниже примере создается класс Roman, который отвечает на методы с именами, состоящими из римских цифр, и возвращает соответствующие целочисленные значения.

Я думаю (не верьте мне в этом), функция method_missing по умолчанию делаетчто-то вроде NoMethodError с сообщением "неопределенный метод` # {method_name} 'для # {inspectVariableValue}: # {ClassName} ".

...