2012-01-23 8 views
0

を評価されていないループ内の「未定義のメソッド」エラー:レールこのコードは(HAMLを使用して)正しく動作

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

しかし、私は

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

すなわち「evalの」行を削除した場合、私はエラーが表示されます。

undefined method `email' for nil:NilClass 

ので、データベースのコメント(何が存在しない場合でも、ループの内容は評価されるべきではない)。何が起こっている?

+2

' - !!eval(" comment.user ")。nil?'これは醜いです。単に ' - comment.user'を使用してください。 –

+0

@MikhailNikalyukin thx、私はより洗練された構文を探していました。私は前にそれを試したと思っていましたが、今ではうまくいきます:) –

答えて

1

ああ、問題は解決しました!

問題が投稿されたコードの上に、私はラインを持っていたことだった:私は、エラーが消えループ以下そのフォームを移動

= 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であるため除算の失敗しますが、paramがnilです。

+1

OPは、なぜ彼はnil.emailバグを取得しているのですか?@ blog.commentsは空でなければなりません。 )) – Romain

+0

申し訳ありませんが、 –

+0

thxの回答を更新しましたが、ERBテンプレートでもこの問題が発生していると思います($ {}構文を使用しないで) –

関連する問題