2010-08-13 51 views
2

我收到以下错误信息,并且想用来使用.nil?方法我可以通过识别异常来避免发生错误。但我不知道。如何避免红宝石在轨道上无班级?

第40行显示我收到错误...它似乎认为contact.latest_event为零。但不应该.nil?帮助我避免发生错误?谢谢...!

ActionView::TemplateError (undefined method `<=>' for nil:NilClass) on line #40 
of app/views/companies/show.html.erb: 
37:  <p> 
38:    <%= full_name(contact) %>, <%= contact.status %><%= contact.titl 
e %>, 
39:    <span class='date_added'>added <%= contact.date_entered %> 
40:      <% if !contact.latest_event.nil?%> 
41:      last event: <%= contact.latest_event.date_sent %> 
42:      <% end %> 
43:    </span> 

这里是latest_event:

def latest_event 
    [contact_emails, contact_calls, contact_letters].map do |assoc| 
      assoc.first(:order => 'date_sent DESC') 
     end.compact.sort_by { |e| e.date_sent }.last 
end 

我想这是没有任何模型contact_emails的可能,例如,已经完成......但我该怎么办,如果没有任何那存在?

+0

请问您可以发布'latest_event'方法的代码吗? – 2010-08-13 16:35:38

+0

只是做了...谢谢 – Angela 2010-08-14 03:55:21

回答

0

我相信你能解决你的问题,改变latest_event方法。

def latest_event 
    events = [contact_emails, contact_calls, contact_letters].map do |assoc| 
      assoc.first(:order => 'date_sent DESC') 
     end.compact 

    events.sort_by{ |e| e.date_sent }.last unless events.blank? 
end 

而只是一个评论:当你需要if就像这个

if !contact.latest_event.nil? 

,最好使用unless

unless contact.latest_event.nil? 
+0

现在很酷的尝试...我实际上有除非声明,但它是错误的,所以认为我使用它错了。所以会按照你的说法放回去,谢谢,现在就来看看吧! – Angela 2010-08-15 17:30:53

+0

哦废话 - 仍然得到相同的错误....为什么它在做<=>即使我不使用它? – Angela 2010-08-16 21:53:15

+0

是不是'date_sent'零? – 2010-08-17 11:23:45

2

我不知道latest_event做什么,但它看起来像你的零实际上在latest_event,因为它正在做一个比较(<=>)。 latest_event是什么样子的?

+0

嗨,juts增加了它....嗯...我如何检查它是否无错误出? – Angela 2010-08-14 03:55:50

0

方法< =>用于实现基本运算符<,>,=>,...(请参阅module Comparable)。但是我看不到你在哪里使用它们,实际上......它可能在latest_event方法中。

旁白,下面的语句是等价的:

if !contact.latest_event.nil? 
unless contact.latest_event.nil? 
if contact.latest_event # Only nil and false evaluate as false 
+1

我发现这3个中的最后一个是最好的:) – theIV 2010-08-13 21:35:23

0

你隐式使用<=>当您使用sort_by

这里有一个可能的解决方法,假设date_sent持有Date对象:

def latest_event 
    [contact_emails, contact_calls, contact_letters].map do |assoc| 
    assoc.first(:order => 'date_sent DESC') 
    end.compact.sort_by { |e| e.date_sent.nil? ? Date.new : e.date_sent }.last 
end 

你的问题是,你的一些记录具有在date_sentnull。当您请求ruby按此值排序时,ruby不知道如何将nilDate进行比较。要进行排序比较,ruby使用<=>(有关此运算符的内容,请参阅文档herehere)。

在上面的代码中,我添加了替代占位符Date的逻辑,当date_sentnil时。那个占位符是4月1日-4712(一个非常古老的日期)。这意味着date_sent == nil的记录将首先放在排序结果中。

如果您date_sentTime,那么你可以使用Time.at(0)而不是Date.new