nil的未定义方法:NilClass

时间:2013-07-23 15:05:33

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord

我收到以下错误。我知道原因是我在相关记录上调用了一个尚未相关的函数,但不知道修复此问题的最佳方法。

导致错误的代码:

<%= link_to member.names.last.fullname, polymorphic_path([member, Name]) %>

在此示例中,Name与Member具有belongs_to关系,Member与Name具有has_many关系。它恰好是一种多态关系,但我认为这不会对此错误产生影响。

当调用上面的代码并且没有相关的名称时,错误是:

  

nil的未定义方法`fullname':NilClass

我确信这里有一些非常基本的东西可以防止这种情况发生。提前感谢您提供的所有帮助!

标记

更多代码:

class Name < ActiveRecord::Base
belongs_to :person, polymorphic: true

attr_accessible :dob, :dod, :first, :gender, :last, :mi, :prefix, :relation, :suffix

def fullname
first + last
end
end


class Member < ActiveRecord::Base
has_many :names, as: :person

attr_accessible :active, :deleted
end

1 个答案:

答案 0 :(得分:1)

解决此问题的快捷方法是使用#try

<%= link_to member.names.last.try(:fullname), polymorphic_path([member, Name]) %>

这将解决错误。但是,它会显示没有任何价值的链接 因此,您需要为您的成员提供默认的fullname值。

一种解决方案是向fullname模型添加Member方法。

class Member < ActiveRecord::Base
  def fullname
    if names.any?
      names.last.fullname
    else
      "John Doe"
    end
  end
end

然后,在您看来,您只需要这样做:

<%= link_to member.fullname, polymorphic_path([member, Name]) %>

如果该成员未定义任何名称,则回退到默认值。在这里,它是“John Doe”。但是把它设置成你想要的任何东西。

另一种解决方案是强制该成员至少拥有一个名称。

class Member < ActiveRecord::Base
  has_many :names, as: :person
  validates :names, presence: true
end

您的会员将有验证错误,我无法保存,除非他指定至少一个名称 使用此功能,您还需要使用nested attributes,以允许成员在创建自己时有效地添加其名称,而不是在之后。