2014-05-17 2 views
0

내 sinatra 응용 프로그램에서 정말 이상한 문제가 발생합니다. 중요한 코드 부분은 다음과 같습니다.왜 정의 되었습니까? 상태

puts "url: #{url.inspect}" 

is_music_post = nil 
is_video_post = nil 

is_music_post = defined?(url.music_post_id) != nil 
is_video_post = defined?(url.video_post_id) != nil 

puts "vid post: #{is_video_post}" 
puts "music post: #{is_music_post}" 

URL 개체는 mongo mapper에서 가져온 것입니다. 그들은 다음과 같이 :

obejct 1

다음

#<Url _id: BSON::ObjectId('5345d525dcdda73224000240'), music_post_id: BSON::ObjectId('5345d51fdcdda7322400023d'), nice: "beat-rooftop", post_id: nil>

그것이 반환 예상대로 작동 :

vid post: false 
music post: true 

obejct 2

#<Url _id: BSON::ObjectId('5345d2f6dcdda732240001d8'), nice: "my-tale-boney-m-steppenwolf", post_id: nil, video_post_id: BSON::ObjectId('5345d2f6dcdda732240001d7')>

여기

이상한 될, 나는 비디 게시물에 대한 진정한 음악 게시물에 대한 잘못된 기대,하지만 난 얻을 : 3

#<Url _id: BSON::ObjectId('5345d525dcdda73224000240'), music_post_id: BSON::ObjectId('5345d51fdcdda7322400023d'), nice: "beat-rooftop", post_id: nil>

vid post: true 
music post: true 

obejct 그리고 그녀는 모두 동일합니다 값이 참임

vid post: true 
music post: true 

WFT

내 추측은 어딘가에 뭔가 상태라고 말합니다. 어떻게 매번 다시 평가하도록 할 수 있습니까?

내 시스템

루비 -v 루비 2.0.0p353 (2013년 11월 22일 개정 43784) [x86_64에-리눅스]

내가 @iain를 잘 할 수 있다고 생각

업데이트 게으른 로딩 설명. 이것이 사실이라면이 경우 어떻게 비활성화 할 수 있습니까? 그것의 모양으로

+0

'정의 된 (url.music_post_id)'이 당신에게 무슨 일이 일어나는지 힌트를 줄 수 있습니까? – bjhaid

+0

사실 일 때 반환 방법이 0이고 거짓 일 때는 아무 것도 예기치 않은 것 같습니다. –

+0

예상치 못한 일이 발생하지 않는다면 아무런 예상치 못한 질문이 – bjhaid

답변

0

는 MongoMapper 당신이 만날 수있는 더 나은 테스트를 찾아야합니다, 그래서 필드가 정의되어 있는지 여부를 필드의 을 확인하는 것이 아니라 게으르게 및 defined? 속성을 만드는 당신의 예상 된 목표. There is a discussion about adding lazy attributes from a while back on the mailing list, 그것이 구현되었는지는 모르겠지만.

개체를 처음 만들 때 music post이므로 true이되지만 vid post은 생성되지 않습니다. 두 번째로 음악 포스트 필드를 사용하지 않지만 어쨌든 마지막 오브젝트로 생성되었으므로 truetrue이됩니다. 객체 3은 truetrue이 될 수도 있습니다.

두 번째 개체를 먼저 넣으십시오.vid posttrue이 표시되고 music post에 대해 false가 표시되면 속성 정의 방법에 대해 알 수 있습니다.

+0

나는 개체 순서를 바꾸는 것으로 당신의 생각을 시험해 본다. 그러나 나는 이것이 정확하게 일어날 수있는 방법을 아직도 이해하지 못한다. –