2011-05-10 5 views
2

주소, 우편 번호, 주/국가, 전화 번호 등의 필드를 포함하는 여러 모델이 있다고 가정 해 보겠습니다.레일에서 유효성 검사 논리와 정규식을 리팩토링하는 가장 좋은 방법은 무엇입니까?

이들은 특정 정규식 유효성 검사가있는 일반적인 필드입니다. 각 모델에 동일한 유효성 검사와 정규 표현식을 넣으면 복제됩니다. 또한 테스트가 중복됩니다.

사물의 이러한 종류의 리팩토링 루비와 레일을 사용하는 가장 좋은 방법은 무엇이다),이 냄새인가? 모듈?

최대 절전 모드 자바에서, 우리는 주소를 저장하는 구성 요소 클래스를 사용하는 것, 그리고 우리가 검증 로직을 넣어 것입니다. 주소를 사용하고자하는 각 모델에는 단순히 하나만 포함되며 모든 주소 확인 논리를 갖습니다.

레일에서 동일한 것을 달성하기위한 접근 방법은 무엇입니까? 감사!

+0

모듈 아이디어가 나에게 떠오르는 것 같습니다. 나는 적절한 기능을 가진 모듈을 만들고 그것을 섞어 넣는다. –

+0

주소 컬럼을 별도의 테이블로 옮겨서 다형성 연관을 사용하는 것을 고려해 볼 수있다. (예 :'belongs_to : addressable, : polymorphic => true') – zetetic

+0

심지어 모듈이 아닌 자신 만의 클래스를 만들 수도 있습니다. –

답변

1

필요한 다양한 유형의 유효성 검사에 대한 사용자 정의 유효성 검사기를 작성한 다음 모델 클래스에서 호출합니다. 예를 들어

:

 
class PostalCodeValidator < ActiveModel::EachValidator 
    def validate_each(record, attr_name, value) 
    unless value =~ /^\d{5}$/ 
     record.errors[attr_name] << "must be a 5-digit postal code" 
    end 
    end 

지금 각 모델 클래스와 우편 번호 각 속성에 대해 그 유효성 검사를 사용합니다. 예를 들어, 경우 고객은 속성 우편 _ 번호가 있습니다

 
class Customer < ActiveRecord::Base 
    validates :postal_code, :postal_code => true 
end 

더 디테일과 화려한 옵션이 많이 있습니다를, 그래서 사용자 지정 유효성 검사기를 레일에 Google 검색을 제안한다.

+0

실제 필드를 모듈 등으로 리팩토링 할 가치가 있습니까? 예를 들어 ... 주소, 우편 번호 및 지방 ID는 기본적으로 항상 함께 그룹화됩니다. – egervari

+0

당신은 그 모듈에 심각한 기능을 추가 할 것인가 아니면 그냥 구조체의 일종으로 사용 할까? 함께 그룹화 된 필드를 사용하는 클래스가 두 개 이상 있고 해당 그룹과 연관된 여러 메서드가있는 경우이를 수행합니다. 의사 결정의 기준은 실제로 단순화하고 복잡성을 추가하는 것입니다. – Elad

+0

좋아, 나는 더 이상 현명하지 않게 될 때까지 간단한 일을 할거야;) 고마워. – egervari

관련 문제