2012-08-12 3 views
1

레일즈 모델에서 유효성 검사를 위해 조건부 allow_nil 옵션을 사용할 수 있는지 궁금합니다. 내가하고 싶은 무엇레일 모델 유효성 검사 조건부 allow_nil?

그래서 내가 초안으로 저장 될 수있는 제품의 모델이 몇 가지 논리에 (다른 속성)을 따라 allow_nil 할 수있을 것입니다. 초안으로 저장 될 때 가격은 0이 될 수 있지만 초안이 저장되지 않으면 가격이 숫자 여야합니다. 나는 어떻게 이것을 할 수 있는가? 다음은 작동하지 않는 것 같습니다. 임시 사례의 경우 작동하지만 상태가 초안이 아닐 때도 허용합니다.

class Product<ActiveRecord::Base 
    attr_accessible :status, price 
    validates_numericality_of :price, allow_nil: :draft? 

    def draft? 
    self.status == "draft" 
    end 

end 

레일 문서를 보면 방법이 allow_nil을 통과 할 수있는 옵션이없는 것처럼 보이는?

한 가지 가능한 해결책은 두 경우 모두

with_options :unless => :draft? do |normal| 
    normal.validates_numericality_of :price 
end 

with_options :if => :draft? do |draft| 
    draft.validates_numericality_of :price, allow_nil: true 
end 

이 작업을 얻을 수있는 다른 방법에 대해 별도의 검증을 할 수있다?

감사

답변

5

당신은 위의 다음과 같은

class Product<ActiveRecord::Base 
    attr_accessible :status, price 
    validates_numericality_of :price, allow_nil: true, if: :draft? 
    validates_numericality_of :price, allow_nil: false, unless: :draft? 

    def draft? 
    self.status == "draft" 
    end 

end 

을 할 ifunless을 사용할 수 있습니다, 당신은,이 개 검증이 설정 NILS를 허용 할 때 draft? == true을 적용 하나가, 것 하나가 인 경우 닐을 허용하지 않습니다.

+0

감사합니다. 이것은 제가 제안한 것과 같습니다. 조건부 allow_nil을 갖는 방법이 있는지 궁금한가요? 어쨌든 고마워. 받아 들일거야. – Abid