2013-08-06 178 views
0

我无法弄清楚我的生活为什么这个崩溃。我已经阅读了大量的stackoverflow和谷歌搜索指南,他们都说同样的事情,这就是我正在做的事情。Rails未定义的方法?

下面是代码:

current_schedule_record['next_oil_change'] = Maintenance.where("vehicle_id = ? AND maintenance_type = ?", id, 'oil change').select("kilometres").order('kilometres DESC').first.kilometres 
if current_schedule_record['next_oil_change'].blank? 
    current_schedule_record['next_oil_change'] = current_schedule_record['next_oil_change'] 
else 
    current_schedule_record['next_oil_change'] = nil 
end 

基本上我想检查是否该记录存在,吐回来了,如果不返回零。

错误我得到的是:undefined method 'kilometres' for nil:NilClass

+0

它抛出的错误,因为你正在做的查询返回任何结果。查询本身应该是有效的。 您应该检查是否有数据库中正在查找的记录。 更好的方法是在访问属性之前检查查询结果是否为零。 – yarakyo

回答

1

你可以尝试少量重因素:

maintenance = Maintenance.where("vehicle_id = ? AND maintenance_type = ?", id, 'oil change').select("kilometres").order('kilometres DESC').first 

current_schedule_record['next_oil_change'] = maintenance.nil? ? nil : maintenance.kilometres 

if current_schedule_record['next_oil_change'].blank? 
    current_schedule_record['next_oil_change'] = current_schedule_record['next_oil_change'] 
else 
    current_schedule_record['next_oil_change'] = nil 
end 

编辑:

你正在做的没有错,你的保养查询没有返回任何结果将自动实例化为第一个维护对象返回(.first)。

由于没有结果,所以.kilometres方法将因针对nil对象执行而失败。

您需要明确检查是否有返回的对象,然后执行.kilometres方法。

另一种选择是try方法:

current_schedule_record['next_oil_change'] = Maintenance.where("vehicle_id = ? AND maintenance_type = ?", id, 'oil change').select("kilometres").order('kilometres DESC').first.try(:kilometres) 

if current_schedule_record['next_oil_change'].blank? # Might want a .nil? check here instead. 
    current_schedule_record['next_oil_change'] = current_schedule_record['next_oil_change'] 
else 
    current_schedule_record['next_oil_change'] = nil 
end 
+0

那么现在我用了一个计数检查,计数记录数量,如果大于0,那么执行我的选择,那是有效的。但我想弄清楚我以前做错了什么,以便我知道未来的项目。感谢您的帮助。 – Bojan

+0

我更新了我的答案。 –

+0

感谢您的更新答案。 – Bojan