我在以下某个观点中遇到以下代码的问题:
<% @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 似乎未被识别为用户模型的实例。我做错了什么?
答案 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) %>
就像从上面开始。
享受你的编码^^