2009-05-27 3 views
2

특성이 null 일 수있는 모델이 있지만 null 특성을 읽을 때 특별한 조치를 취하고 싶습니다. 특히, 나는 예외를 던지고 싶습니다. 즉,모든 ActiveRecord 특성 접근자를 래핑 할 수있는 방법

class MyModel < ActiveRecord::Base 
    def anAttr 
     read_attribute(:anAttr) or raise MyException(:anAttr) 
    end 
end 

모두 괜찮 으면 좋겠지 만 각 속성에 대해 동일한 사용자 지정 액세서를 직접 코딩해야합니다.

read_attribute를 재정의 할 수 있다고 생각했지만 재정의 된 read_attribute가 호출되지 않습니다. 이 작업을 수행해야 할 것입니다 왜

+1

정말 이유를 물어야합니다. 여기에 당신의 유스 케이스는 무엇입니까? 확실히 더 좋은 방법이 있습니다. "예외적 인 경우는 예외입니다." Nil은 거의 예외적 인 것처럼 보입니다. –

+1

그것은 합리적인 질문이지만 여기에 설명 할 여지가 많지 않습니다. 요컨대, 우리는 많은 선택적 필드들을 가진 폼을 가지고있다. 제출시 우리는 양식에 대한 일련의 규칙을 적용하기를 원합니다. 각 규칙에 대해 "예", "아니요"또는 "정보가 충분하지 않음"중 하나가 표시됩니다. 그 자체만으로는 "예외에 의한 중단"방법을 제안하지 않습니다. 하지만 우리는 외부 적으로 규칙을 가능한 한 간단해야하는 DSL 또는 정렬에 저장합니다. 따라서 규칙 자체의 언어는 null을 검사 할 수 없습니다. 대신 규칙은 값만 사용하며 정의되지 않은 값에 대한 액세스가 있으면 평가가 중단됩니다. –

답변

4

확실하지,하지만 슬프게도 :

재미
def get(attr) 
    val = self.send(attr) 
    raise MyException unless val 
    val 
end 

@object.get(:name) 
1

, 우리는 오늘이 같은 일에보고 있었다. 속성에 대한 모든 레일스 로직이있는 곳인 attribute_method.rb을 확인하십시오. 재정의 할 수 있어야하는 define_attribute_methods 메소드가 표시됩니다.

결국 우리는 이것을 다른 방식으로 수행 할 것이라고 생각하지만, 도움이되는 운동이었습니다.

관련 문제