2010-12-20 12 views
0

이 구현하는 가장 좋은 방법은 무엇인지 모르겠습니다 - 기본적으로 내 모델의 내 : start_amount 필드가 0에서 user.amount 범위 내에 있는지 확인하고 싶습니다. 다른 검증과 같이 정적이 아니기 때문에 'user.amount'라고하는 방법을 모르겠습니다.사용자 정의 레일 유효성 검사

(참조를 위해 나는 validates_numericality_of :start_amount, :allow_nil => false, :greater_than => 0

을 한 다음 동일한 모델에서 이런 짓을 : 어쩌면 (

def validates 
    self.errors.add(:start_amount, "is out of range") unless self.amount_in_allowed_range 
    end 

    def amount_in_allowed_range 
    start_amount <= user.amount 
    end 

그것은 검증이 필요했다 위해 내가 다른 클래스를 만드는 생각하지 않았다 아주 간단 그게 작동하는 유일한 방법이야?) 그것은 내가 을 비교했을 때 어떤 경우에는 start_amount을 공백으로 남겨 두었을 때를 제외하고는 괜찮 았고, 에러를 주었다. (나는 이상하다고 생각한다. 왜냐하면 validates_numericality_of- 그러나 나는 추측한다. e 사용자 지정 유효성 검사가 먼저 실행됩니다. 그런 다음 위의 내용으로 :allow_nil => false으로 변경했으며 마이 그 레이션에서 :null => false, :default => 0으로 설정했습니다. 이제는 전혀 확인하지 않는 것입니까? 또는 영구적으로 0이고, 따라서 항상 유효성 검사를 통과합니다.)

저는 레일이 정말 새롭고 도움이됩니다. 감사!

답변

4
validates_numericality_of :start_amount 
validate :amount_in_allowed_range 

def amount_in_allowed_range 
    self.errors.add(:start_amount, "is out of range") unless start_amount <= self.user.amount 
end 

현재 모델의 사용자가 belongs_to 인 경우 작동합니다. 사용자 지정 유효성 검사 메서드는 단 수로 선언됩니다 (validates 대신 validate). 또한 allow_nil은 기본적으로 false입니다. 귀하의 노선에 :default => 0이 왜 설정되었는지 잘 모르겠습니다. 마이그레이션을 의미 했습니까? 설정 내용이 조금 더 자세하게 설명해주십시오. 을 user.amount과 비교했을 때 어떤 종류의 오류가 발생 했습니까?

+0

아 그렇습니다. 나는 이주를 의미했지만, 기본값 => 0 (수정 됨)이 아닙니다. 내가 제안한 것을 사용할 때 아무런 변화가 없습니다. 마치 사용자 정의 유효성 검사가없는 것과 같습니다. 기본 유효성 검사 유효성 검사 이름 인 것처럼 보였으므로 def 유효성 검사를 사용했습니다. .errors.add없이 사용자 정의 오류를 어떻게 제기 할 수 있습니까? nil이 user.amount와 비교 될 때 오류는 NoMethodError입니다. – butterywombat

+0

맞습니다.'errors.add'가 필요하며 조건부 여야합니다. 그것을 반영하는 방법을 편집했습니다. – fflyer05

관련 문제