NoMethodError“nil的未定义方法`email':NilClass”

时间:2011-06-13 12:31:40

标签: ruby-on-rails

我在以下某个观点中遇到以下代码的问题:

<% @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 似乎未被识别为用户模型的实例。我做错了什么?

4 个答案:

答案 0 :(得分:8)

在尝试调用方法之前,您需要检查comment.user是否为零。 if语句可以为您执行此操作:

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

答案 1 :(得分:3)

在这种情况下,您似乎没有将用户与评论相关联。首先,您必须以某种方式设置用户,例如在创建用户时。如果您不总是想这样做,则需要检查用户是否实际设置。

答案 2 :(得分:0)

您可能没有为用户设置email

对于不再抛出错误消息的应用,您可以尝试:

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

但是我认为这是一个很好的做法,模型验证应该在这里。

答案 3 :(得分:0)

问题是已删除的数据库实体/实体的值。

为了防止您必须使用的所有错误

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

就像从上面开始。

享受你的编码^^