2010-08-13 3 views
2

다음과 같은 오류 메시지가 표시되고 .011을 사용하여 으로 생각됩니다. 메서드 예외를 식별하여 오류가 발생하는 것을 피할 수 있습니다. 하지만 나는 그렇지 않습니다.레일즈에서 루비의 nil 클래스는 어떻게 피할 수 있습니까?

라인 40에서 오류가 발생하는 것으로 나타났습니다 ... contact.latest_event는 nil이라고 생각되는 것 같습니다. 그러나 .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' 메소드의 코드를 게시 하시겠습니까? –

+0

방금 ​​했어요 ... 고마워요 – Angela

답변

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 !contact.latest_event.nil? 

같은 if의 필요로 할 때이 unless를 사용하는 것이 좋습니다 : 당신이 sort_by를 사용할 때 암시 적으로 <=>을 사용하고

unless contact.latest_event.nil? 
+0

멋지게 시도해보세요 ... 나는 실제로 진술을하지 않고 있었지만 잘못 사용하고 있다고 잘못 생각했습니다. 당신이 말했던 것처럼 그것을 다시 놓을 것입니다, 감사합니다, 지금 그것을 확인하십시오! – Angela

+0

오, 쓰레기 - 아직도 같은 오류가 .... 나는 그것을 사용하지 않더라도 <=>을하고있는 이유는 무엇입니까? – Angela

+0

'date_sent'가 아닌가요? –

2

무엇이 latest_event인지 모르겠지만 실제로는 비교가 이루어지지 않아서 latest_event 인 것으로 보입니다. (<=>). latest_event는 어떤 모습입니까?

+0

안녕하세요, juts가 추가했습니다 .... 음 ... 오류가 발생하지 않고 nil인지 어떻게 확인하나요? – Angela

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

0

.

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_sent 열에 null을 가지고있다 :

여기 date_sentDate 개체를 보유하고 있다고 가정하면, 하나의 가능한 해결 방법입니다. 루비가이 값으로 정렬하도록 요청할 때, 루비는 과 Date을 비교하는 방법을 모른다. 정렬 비교를 수행하기 위해 ruby는 <=>을 사용합니다 (이 연산자의 기능에 대한 herehere 참조).

위의 코드에서 date_sentnil 일 때 자리 표시 자 Date을 대체하는 논리를 추가했습니다. 이 자리 표시자는 1 월 1 일 -4712 (매우 오래된 날짜)입니다. 즉, date_sent == nil이있는 레코드가 정렬 결과에서 맨 앞에 놓이게됩니다.

date_sentTime 인 경우 Date.new 대신 Time.at(0)을 사용할 수 있습니다.

관련 문제