Ruby on rails 未定义的方法“email';对于nil:NilClass link.user.email

Ruby on rails 未定义的方法“email';对于nil:NilClass link.user.email,ruby-on-rails,ruby,ruby-on-rails-3,ruby-on-rails-4,ruby-on-rails-3.2,Ruby On Rails,Ruby,Ruby On Rails 3,Ruby On Rails 4,Ruby On Rails 3.2,在我的index.html.erb文件中,我得到了一个未定义的电子邮件方法。我进入rails控制台,试着运行User.first.email,效果非常好。我试着拿出电子邮件并运行link.user,这也奏效了。我不知道为什么当一个用户绑定到一个链接,而一个用户有一封电子邮件时,电子邮件会被认为是未定义的。我正在寻找一些关于可能出现问题的建议 Index.html.erb <%= link.user.email %> 型号: class Link < ActiveRecord:

在我的
index.html.erb
文件中,我得到了一个未定义的电子邮件方法。我进入rails控制台,试着运行User.first.email,效果非常好。我试着拿出电子邮件并运行
link.user
,这也奏效了。我不知道为什么当一个用户绑定到一个链接,而一个用户有一封电子邮件时,电子邮件会被认为是未定义的。我正在寻找一些关于可能出现问题的建议

Index.html.erb

<%= link.user.email %>
型号:

class Link < ActiveRecord::Base
    belongs_to :user
    validates :user, presence: true
    acts_as_votable
    attr_accessor :avatar
    mount_uploader :avatar, AvatarUploader
end

class User < ActiveRecord::Base
    has_many :links
    acts_as_voter
    devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
end

此错误的原因是
链接。用户
nil
。您必须检查它是否为
nil
如:

<% if !link.user.nil? %>
  <%= link.user.email %>
<% end %>

出现此错误的原因是,对于某些链接,
link.user
nil
,因此它调用
nil.email
,并在出现上述错误消息时失败

您可以使用以下方法来解决此问题:

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


这样,即使在某些情况下,
link.user
nil
,您的程序也不会崩溃。

对于特定的
用户
可能会有一些
电子邮件
is
nil
,您可以使用
try
来摆脱NilClass的
未定义方法

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

我知道你接受了另一个答案,但我认为这是不正确的


该错误意味着您的
链接
没有关联的
用户
对象

如果您希望每个
链接
都有一个相关的
用户
,那么最好使用确保它出现在
创建
更新上:

#app/models/link.rb
class Link < ActiveRecord::Base
   belongs_to :user
   validates :user, presence: true
end
#app/models/link.rb
类链接
这意味着每次创建
链接
,它都必须有一个
用户
对象;首先要防止错误

--

如果这就是您需要应用程序运行的方式(即只有用户可以发布链接或其他内容),则不需要视图中的
.nil?
.try()
条件语句


简言之,我认为公认的答案就像是在生锈的表面涂上油漆(没有冒犯的意思等)。

我认为您需要检查链接迁移文件

class CreateLinks < ActiveRecord::Migration
class CreateLinks

在这个文件中,您需要
t.attown\u to:user\u id

我有一个问题,为什么您认为如果有用户并且用户已登录,电子邮件会显示为零?根据错误消息,
link.user
在某些情况下返回
nil
,这意味着有些链接与任何用户都没有关联。因此,对于这些链接,
link.user
nil
。在这种情况下,如果您尝试:
link.user.email
,那么它将转换为:
nil.email
,这就是为什么您会收到错误消息:
undefined method
email'For nil:NilClass`。好的,这是有意义的。现在我只需要弄清楚为什么链接和用户之间的关联不起作用?我有一个链接类,它属于一个用户,一个用户有很多链接。不完全确定它为什么不会拾取外键。
是否会在
user
上尝试
,假设
user
存在?IE它无法实现OP想要的功能?@Jbur43如果您没有任何验证来确保链接对象始终具有关联的用户,则可能是您以某种方式创建了链接,但没有将任何用户关联到该链接。但是,您可以为链接模型中关联用户的存在添加验证,如下面Rich Peck的回答所示。这将阻止在没有用户的情况下创建任何链接。但是,这不会修复数据库中已有的任何以前的数据。因此,您必须在没有用户的情况下通过手动将用户关联到链接对象来修复现有的链接对象。我认为,您所说的,
接受的答案不正确是不正确的。他接受了这个答案,因为它防止了他的程序崩溃。首先添加验证并防止此类错误肯定更好,但是想象一下OP可能已经在数据库中有了无法重置的链接对象,在这种情况下,他仍然需要
尝试
方法来防止他的
索引
页面崩溃。可能只有一个或几个没有相关用户的链接,在这种情况下,OP可以手动更新我在上面评论中提到的数据库中的链接。希望它能澄清事实。如果您仍然认为我的答案不正确,请告诉我:)嘿,Rich,我尝试添加验证,但现在我无法提交新链接,因为用户不在那里,这是一件好事,因为现在我知道关联仍然不起作用。我很好奇,你或@KMRakibulIslam知道为什么协会在这个案子中不起作用吗?我还是被难住了。我发布了我的新模型。我还发布了我的rails日志。它在事务中显示它看到的是我的用户id,但随后回滚事务?@Jbur43我认为您应该使用最新信息创建另一个问题。
<%= link.user.try(:email) %>
<%= link.try(:user).try(:email) %> 
<%= link.user.try(:email) %> 
#app/models/link.rb
class Link < ActiveRecord::Base
   belongs_to :user
   validates :user, presence: true
end
class CreateLinks < ActiveRecord::Migration