1

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

导致错误的代码:

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

在此示例中,Name 与 Member 具有belongs_to 关系,Member 与Name 具有has_many 关系。它恰好是一种多态关系,但我认为这对于这个错误并不重要。

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

nil: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
4

1 回答 1

1

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

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

这将修复错误。但是,它将显示一个没有任何值的链接。
因此,您需要为您的成员提供一个默认的全名值。

一种解决方案是在模型中添加一个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

您的成员将出现验证错误,并且无法保存我,除非他指定了至少一个名称。
使用它,您还需要使用嵌套属性,以允许成员在创建自己时有效地添加他的名字,而不是之后。

于 2013-07-23T15:15:45.773 回答