2010-09-30 5 views
0

я получаю следующее сообщение об ошибке:Что такое неопределенный метод [] означает в рельсах?

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> 

ответ

1

Посмотрите, как у вас есть 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 "" для установки альтернативного значения, если оно равно нулю. Вы можете заменить его на rescue "none." или любую другую строку, которая имеет смысл.

+0

, хотя не ответил на вопрос, это полезно изменить, мне нужно сделать ... спасибо +1 – Angela

+0

У него действительно есть * решение * на ваш вопрос, но я добавил примечание, которое делает его явным. –

+0

ах, да - спасение также является ключевым компонентом решения, которое я вижу .... – Angela

2

Это означает, что вы назвали [] на нулевой объект. В этом случае next_delayed_todo был равен нулю.

Вы хотите что-то большее: , если next_delayed_todo.nil? || next_delayed_todo [: событие] .nil?

+0

Привет, У меня есть следующий код несколько строк вверх: <%, если next_delayed_todo.nil? || next_delayed_todo [: событие] .nil? %> hmm ... так не совсем точно, что делать ... – Angela

+0

ах, интересно ... это в моем местном, но не на героику, я думаю ... позвольте мне внести некоторые коррективы. – Angela

2

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

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

0

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

method_missing является функцией -http: //ruby-doc.org/core/classes/Kernel.html#M005925

Invoked by Ruby when obj is sent a message it cannot handle. symbol is the symbol for the method called, and args are any arguments that were passed to it. By default, the interpreter raises an error when this method is called. However, it is possible to override the method to provide more dynamic behavior. The example below creates a class Roman, which responds to methods with names consisting of roman numerals, returning the corresponding integer values.

я думаю (не доверяют мне на этом) method_missing по умолчанию функция делает что-то вроде NoMethodError с сообщением «undefined method» # {method_name} 'for # {inspectVariableValue}: # {ClassName} ".

0

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

<%=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 %> 
Смежные вопросы