2012-01-23 5 views
0

Этот код работает правильно (с использованием HAML):рельсы "неопределенный метод" ошибка внутри контура, который не оценивается

#comments 
    - @blog.comments.each do |comment| 
    .comment 
     .username 
     - if !eval("comment.user").nil? 
      #{comment.user.email} 
     .content 
     #{comment.content} 

Однако, если удалить строку "Eval" т.е.

#comments 
    - @blog.comments.each do |comment| 
    .comment 
     .username 
     #{comment.user.email} 
     .content 
     #{comment.content} 

I получаю сообщение об ошибке:

undefined method `email' for nil:NilClass 

Даже когда нет комментариев в базе данных (следовательно, содержимое цикла не должно оцениваться). Что происходит?

+2

'- if! Eval (" comment.user "). Nil?' Это уродливо, просто используйте '- if comment.user' –

+0

@MikhailNikalyukin thx, я искал какой-то более чистый синтаксис. Я думал, что пробовал это раньше, но сейчас это работает :) –

ответ

1

Ах, проблема решена!

Проблема в том, что над POSTED кода, я имел строку:

= form_for @blog.comments.build, :remote => true do |f| 

Когда я переехал эту форму ниже петли исчезла ошибка.

1

Попробуйте следующее:

#comments 
    - @blog.comments.each do |comment| 
    .comment 
     .username 
     - if comment.user 
      = comment.user.email 
     .content 
     = comment.content 

Я думаю, что проблема в том, что вы вынуждаете рубин оценить comment.user.email с # {comment.user.email}.

Попробуйте это в консоли:

def fail(param) 
    if param 
    puts "hello #{1/0}" 
    end 
end 

fail(nil) 

Он потерпит неудачу из-за деления на 0, но парам равна нулю.

+1

ОП спрашивает, почему он получает ошибку nil.email, тогда как @ blog.comments должен быть пустым, поскольку таблица комментариев пуста в его БД (или, как он говорит;)) – Romain

+0

извините, я обновил свой ответ –

+0

thx, но я считаю, что у меня тоже была эта проблема в шаблонах ERB (без использования синтаксиса $ {}) –

Смежные вопросы