ActiveRecord关系:nil的未定义方法:NilClass

时间:2013-05-08 21:42:16

标签: ruby-on-rails activerecord

请考虑以下事项:

class Manager < ActiveRecord::Base
  has_many :employees
end
class Employee < ActiveRecord::Base
  belongs_to :manager
end


employee = Employee.first
puts employee.manager.name

如果由于某种原因,员工没有经理,我会得到这个:

undefined method `name' for nil:NilClass

哪个有道理。但是,有没有一个干净/建议的方法来处理这个问题,所以在我要求经理的名字之前,我并不总是需要检查一下员工是否真的有经理?<​​/ p>

4 个答案:

答案 0 :(得分:4)

尝试:

puts employee.manager.name unless employee.manager.nil?

或者:

puts (employee.manager.nil? ? "No manager" : employee.manager.name)

在这种情况下,相当于:

puts (employee.manager ? employee.manager.name : "No manager")

(只要employee.manager不能返回false,则等效。)

答案 1 :(得分:2)

不要试图太聪明。如果您要重复使用它,请将其设为一个功能。

class Employee
   def manager_name
     manager.try(:name).to_s # force empty string for nil        
   end
end

答案 2 :(得分:0)

您可以使用has_attribute?方法进行检查:

employee.has_attribute? :manager

类似于:

puts employee.manager.name if employee.has_attribute? :manager

答案 3 :(得分:0)

我倾向于选择puts employee.manager.try(:name)

如果在nil上调用了try方法,则会返回nil,但如果manager不是nil,则会正确执行该方法。

如果您想要默认文字:

puts employee.manager.try(:name) || "No Manager"