我收到以下错误。我知道原因是我在相关记录上调用了一个尚未相关的函数,但不知道修复此问题的最佳方法。
导致错误的代码:
<%= 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
答案 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,以允许成员在创建自己时有效地添加其名称,而不是在之后。