2010-04-07 5 views
3

필자의 레일 애플리케이션에서 여러 가지 속성 (일명 db 테이블의 열)을 가진 Book 모델이 있습니다. 이러한 속성 중 하나는 "순위 지정"입니다."NoMethodError : undefined method`include? '의 원인은 무엇입니까? nil : NilClass "

최근 응용 프로그램은 다음과 같은 코드를 NoMethodError: undefined method 'include?' for nil:NilClass가 발생하기 시작했다 수

def some_method(book, another_arg) 
    return book.ranking unless book.ranking.blank? 
    ... 
end 

그러나, 일관성이 아니다. 대부분의 시간 동안 book.ranking이 작동합니다 - 오류는 어쩌면 2-4 % 정도 발생합니다. book.ranking 대신 book[:ranking] 또는 book['ranking']으로 코드를 변경하면 100 %의 시간 동안 작동합니다.

아이디어가 있으십니까?

P. 이 문제는 다른 모델 및 속성과 함께 간헐적으로 나타났습니다 ... 책 및 순위 속성뿐 아니라

+0

앱을 다시로드하는 중입니다. 나는 그것이 어디에서 왔는지를 알았지 만, 나는 잊었다. 어딘가에 레일 코드 깊숙이. 아마도 mysql 인터페이스와 관련이 있다고 생각합니까? mysql을 사용하고 있습니까? – mckeed

+0

PostgreSQL을 사용하고 있으며 내 앱이 Heroku에서 실행 중입니다. Heroku의 콘솔에 원격으로 로그인하면이 오류가 항상 나타납니다 (그러나 내 로컬 콘솔에는 나타나지 않습니다). – NudeCanalTroll

+0

나는 이것이 정말로 오래되었다는 것을 알고있다. 그러나 나는'.nil?'보다는'.blank? '를 검사하는 방법과 관련된 동일한 오류를 보면서 upvoted했다.일관되게 발생하지 않으며 동일한 코드의 두 번째 실행 또는 페이지 새로 고침은 항상 예상 된 동작으로 되돌아가는 것처럼 보입니다. 이 작업은 프로덕션 환경을보다 자세히 모방하기 위해 SQLite3에서 MySQL로 dev 환경을 전환했을 때만 시작되었으므로 @mckeed에 동의 할 의향이 있습니다. – Leo

답변

2

도서 개체는 순위가 아닌 nil입니다. 따라서 가지고있는 것은

return book.ranking unless book.nil? 

입니다.

+0

그럴 경우 오류가 'NoMethodError : undefined method'nil : NilClass'에 대해'ranking '되어서는 안됩니까? – NudeCanalTroll

+0

좋은 지적, 나는 틀렸다고 생각합니다. http://github.com/rails/rails/blob/2-3-stable/activerecord/lib/active_record/attribute_methods.rb에서 찾고있는 method_missing (순위 지정 방법을 호출 할 때 호출 됨)이 호출하는 것 같습니다. 포함? @attributes에. 어쩌면 이것은 어떤 이유로 든 제로입니까? –

+1

이 문제가 발생했습니다 :이 스레드에서 많은 사람들이 말한 것처럼 아무 것도없는 개체와 아무 관계가 없지만 레일 내부에서 문제가 발생했습니다. "question.id"가 nil.include를 발생 시켰습니까? 오류가 있지만 "question [: id]"는 정상적으로 작동합니다. 롭이 제안한 것처럼 @attributes와는 무언가 같아 보이지만 나는 그것을 고정시킬 수 없다. "question.attributes"를 로거에 출력하면 완전히 정상적인 결과를 반환하는 것처럼 보였습니다. –

0

중 하나

return book.ranking unless book.blank? and book.ranking.blank? 
1

여기 try을 사용 전무 책이 경우 당신은 확인해야합니다 : 다음 nil가 반환됩니다 nil입니다

book.try(:ranking) 

book 경우 또는 ranking.

+0

시도해보십시오. 그러나 Ruby 1.8에는 없습니다 ... 1.8에서 얻으려면 능동적 인 지원을 사용해야합니다. – severin

+0

@severin : Rails 질문에서 Active Support를 이미 사용하고 있다고 가정했기 때문에. –

0

또한이 방법을 수행 할 수 있습니다

return book.ranking unless book and book.ranking 

또는 andand 보석과 :

return book.ranking unless book.andand.ranking 
1

무풍 통화에서 보호 할 수있는 몇 가지 방법이 있습니다 :

체크 을와 함께 예 : :

return book.ranking if book 

사용 & & /과 :

return book && book.ranking 

사용 (레일/ActiveSupport 루비 1.9 또는과)을 시도 : 콘솔 이후에 가끔 나에게 일어날 사용

return book.try(:ranking)