2011-03-01 2 views
3

한 번 설정 한 속성을 ActiveRecord 모델에서 변경할 수없는 기능을 구현하려고합니다. 이를 위해 다음 메소드를 작성했습니다.ActiveRecord의 플래그가 유효하지 않습니다.

def address 
self[:address] 
end 

def address=(val) 
if new_record? 
    self[:address] = val 
else 
    errors.add(:address, "Cannot change address, once it is set") 
    return false # tried return nil here first, did not work 
end 
end 

여기 뭔가 잘못 되었습니까? 내가 주소를 변경하려고하면 객체를 무효로하고 싶지만 아무런 에러도 발생하지 않는다. obj.valid?

EDIT : 일단 값이 설정되면 변경되지 않지만 잘못된 객체를 얻고 싶다. obj.valid를 통해 유효성 검사를 할 때?

답변

8

obj.valid?을 실행하면 모든 오류가 지워지고 차례로 각 유효성 검사가 실행됩니다. 유효성 검사시 오류가 발생하게하려면 해당 논리를 유효성 검사 블록으로 이동해야합니다.

여기에 인스턴스 변수와 그 한 가지 방법의 예 :

def address=(val) 
    if new_record? 
    self[:address] = val 
    else 
    @addr_change = true 
    return false # tried return nil here first, did not work 
    end 
end 

validate do |user| 
    errors.add(:address, "Cannot change address, once it is set") if @addr_change 
end 
+0

뜨아! 나는 그 생각을 했어야했다. 감사! – rmk

+0

문제 없습니다. 다른 사람들이 같은 질문을하는 경우에 대비하여 나는 후손에 대한 코드 예제를 추가했습니다. :-) – Benson

+0

감사 감사합니다! 이것은 내가 유산 프로젝트를 위해 여러 시간 동안 찾고 있었던 것입니다. – rendon