2011-06-13 63 views
2

我有在我的觀點一個與下面的代碼的問題:NoMethodError「未定義的方法`電子郵件」的零:NilClass」

<% @blog.comments.each do |comment| %> 
<h3><%= comment.user.email %></h3> 
</div> 
<% end %> 

這是產生一個錯誤:

NoMethodError in Blogs#show 
... 
undefined method `email' for nil:NilClass 

然而,下面的代碼工作沒有錯誤:

<% @blog.comments.each do |comment| %> 
<%= comment.body %> 
<% end %> 

評論被聲明爲:

class Comment < ActiveRecord::Base 
    belongs_to :blog 
    belongs_to :user 
end 

和電子郵件屬性是另一個視圖訪問:

<% @users.each do |user| %> 
    <tr> 
    <td><%= link_to user.username, user %></td> 
    <td><%= user.email %></td> 
    </tr> 
<% end %> 

對我來說,它看起來像comment.user沒有被承認爲用戶模型的實例。我究竟做錯了什麼?

回答

8

您需要檢查comment.user在嘗試調用方法之前不是零。一個if語句可以爲你做到這一點:

<% @blog.comments.each do |comment| %> 
    <h3><%= comment.user.email if comment.user %></h3> 
    </div> 
<% end %> 
+5

更合適的是,您可能需要確保在沒有用戶的情況下評論不存在,使用驗證或沿着這些行的內容。上面的代碼將防止錯誤顯示,但我認爲你所看到的是應用程序中管理數據的更大失敗的症狀。 – karmajunkie 2011-06-13 12:35:57

+0

謝謝,這工作!但是,不知道爲什麼,因爲在DB中只有三條評論,並且它們都與相同(有效)的用戶相關聯。 是的,我一定會添加一些驗證。 – 2011-06-13 12:39:33

+0

@karmajunkie是對的。我的解決方案解決了症狀,而不是原因。 – Teddy 2011-06-13 13:12:33

3

它看起來像你有沒有關聯,在這種情況下,評論的用戶。首先,您必須以某種方式設置用戶,例如,在創建用戶時。如果你不總是想這樣做,你需要檢查用戶是否真正設置。

0

有可能您沒有爲用戶設置email

對於應用不會引發錯誤消息了,你可以試試這個:

<%= comment.user.try(:email) %> 

但是我認爲這是很好的做法模型的驗證應該在這裏。

相關問題