2009-12-21 3 views
0

레일의 ActiveRecord는 모델의 컬럼 값 중 하나를 nil로 설정할 때 특별한 규칙이 있습니까?레일 - 모델 값을 0으로 설정

freez 메소드의 온 전성 검사는 항상 실패합니다.

모델 : 프로젝트

칼럼 : non_project_costs_value (null 허용 진수 필드)

def froz? 
    return !(non_project_costs_value.nil?) 
end 


def freez(val) 
    raise 'Already frozen, cannot freeze ... the value is ' + non_project_costs_value.to_s if froz? 
    non_project_costs_value = val 
    save 
    raise 'Sanity check. After freezing the thing should be frozen!' if !froz? 
end 
+0

가 어디 "값 대 0을 설정하는 당신의 FREEZ 방법에 버그가? @ project.freez (nil)과 같은 것을 호출하고 있습니까? – MattMcKnight

답변

2

당신은

non_project_costs_value = val # this is setting a local variable 
           # (in the method freez) to val 

# change to: 
self.non_project_costs_value = val # this will set the record's attribute 
            # (the column) to val 
            # It will be saved to the dbms once you save 
+0

내 'froz'에 버그가 있다는 뜻입니까? method? 거기에 non_project_costs_value를 사용하고 self.non_project_costs_value는 사용하지 않습니다 . – Daniel

+0

아니요. 왜냐하면 fro_ 메서드에 non_project_costs_value라는 로컬 변수가 없기 때문입니다. 그래서 Ruby는 non_project_costs_value 메서드를 찾습니다. 그러나 하나도 찾지 못했지만 ActiveRecord 기계가 "메소드를 찾지 못했습니다"함수를 무시하고 메서드가 원한다는 것을 알려주고 (non_project_costs_value) 속성 값을 제공합니다. 그러나 non_project_costs_value를 로컬 변수로 (할당하여) 정의한 다음 나중에 non_project_costs_value를 참조하십시오. 동일한 이름 범위)는 로컬 변수를 사용할 것입니다. 문서에서이 문제를 논의하지만, 지금 당장은 좋은 참고 자료를 찾을 수 없습니다. –