2013-05-15 1 views
0

배송 주소 및 청구서 수신 주소를 주소 모델로 추출하지 않은 경우 어떻게이 유효성 검사 중복을 제거 할 수 있습니까?모델에서 유효성 검사 중복을 제거하려면 어떻게합니까?

청구서 수신 주소가 배송지 주소와 다른 경우에만 확인하고 싶습니다. 어떻게 모듈로 추출할까요? 예를 들어 모듈에 무엇을 포함할지 모르는 경우 또는 self을 참조 할 때 정말 도움이 될 것입니다.

validates :shipping_name, :shipping_address1, :shipping_street_number, :shipping_city, presence: true 
    validates :shipping_state, inclusion: { in: Address.states.values } 
    validates :shipping_post_code, length: { is: 5 }, numericality: { only_integer: true } 

    validates :billing_name, :billing_address1, :billing_street_number, :billing_city, presence: true, unless: -> { self.bill_to_shipping_address? } 
    validates :billing_state, inclusion: { in: Address.states.values }, unless: -> { self.bill_to_shipping_address? } 
    validates :billing_post_code, length: { is: 5 }, numericality: { only_integer: true }, unless: -> { self.bill_to_shipping_address? } 

답변

1

메서드를 만든 다음 두 가지 주소 유형간에 다른 비트를 전달할 수 있습니다. 이 경우 차이는 필드의 접두어이며 추가 옵션을 전달할 수있는 능력입니다.

module AddressValidator 
    def validates_address(type, options = {}) 
    validates :"#{type}_name", :"#{type}_address1", :"#{type}_street_number", :"#{type}_city", {presence: true}.merge(options) 
    validates :"#{type}_state", {inclusion: { in: Address.states.values }}.merge(options) 
    validates :"#{type}_post_code", {length: { is: 5 }, numericality: { only_integer: true }}.merge(options) 
    end 
end 

class MyModel < ActiveRecord::Base 
    extend AddressValidator 
    validates_address(:shipping) 
    validates_address(:billing, unless: -> { self.bill_to_shipping_address? }) 
end 
+0

감사합니다. 나는 그것이 가치가 있는지 지금 스스로에게 묻는다. – dee