2009-11-04 5 views
11

전자 메일 및 hashed_password와 같은 일반적인 특성을 가진 사용자 모델이 있습니다. 현재 상태를 확인하는 유효성 검사를 작성하고 싶습니다. 이메일 주소 만 (이 객체 데이터베이스에 저장 한Rails 사용자의 전자 메일 유효성 검사 - 사용자가 전자 메일 주소를 등록하거나 업데이트 할 때 유효성을 검사하려는 경우에만

1)이없는 경우에만 즉, 이것은 사용자가 자신의 이메일 주소를 업데이트하려고 가입 새 사용자)

2)입니다 .

나의 현재 검증

validates_presence_of :email 
    validates_presence_of :email_confirmation 

    validates_confirmation_of :email 

분명히 어떤 속성을 업데이트에서 저를 방해하고 있습니다. 나는 사용을 생각했다

validates_presence_of : email : if : email_validation_required?

def email_validation_required? 
self.email.blank? 
end 

그러나 사용자가 DB에 암호 이메일 주소를 가지고 있기 때문에 true를 돌려줍니다으로 시나리오 2와 그 실 거예요 도움이됩니다.

위의 두 가지 시나리오로 제한 할 수있는 방법이 없습니다.

아무도 도와 줄 수 있습니까?

답변

18

EmFi가 뭔가 있다고 생각합니다. 하지만 나는 validates_presence_of :email이 당신을 안고 있다고 생각하지 않습니다. email은 항상 존재해야합니다. 양식에 공백으로 남겨두면 매개 변수가 사용자 저장에 엉망이되지 않습니다. 양식으로 입력 한 경우에도 업데이트를 위해 승차시에 email_confirmation이 있어야합니다.

이 사용 해보세요 :

validates_presence_of :email 
validates_presence_of :email_confirmation, :if => :email_changed? 

validates_confirmation_of :email 
+0

늦은 답장 배리에 대해 유감스럽게 생각합니다. email_confirmation에 대한 password_confirmation 코드를 복제하고 있었지만 다른 요구 사항이 있습니다. 그것을 지적 주셔서 감사합니다. – robodisco

10

두 가지 옵션이 있습니다. 하나는 :on을 사용하는 것입니다. 기본적으로, 그들은 로 설정되어 있지만이

validates_presence_of :email, :on => :create 

또는

validates_presence_of :email, :on => :update 

다른 옵션이 :if을 사용하고 메소드 이름 또는 PROC에 전달하는 것입니다 같은 것을 할 수 있습니다 . 그렇게하는 데 도움이 :)

+0

안녕 매트 덕분에 당신이 도움을. 나는 방법을 사용하여 생각했다 : if하지만 그 안에 논리를 작성하는 방법에 난처한 있어요. 내 모델에 더 많은 특성을 추가 할 필요가없는 방법이 있는지 궁금합니다. 지난 예제에서 signup_stage 속성에 대해 언급했습니다. – robodisco

+0

나는 오히려 일반적인 예를 제공하고있었습니다. 질문을 다시 읽으면 사용자가 db에 비밀번호를 가지고 있다면 이메일이 비어있는 것일까 요? –

+0

죄송합니다. 비밀번호는 오타였습니다. 이메일을 읽었어야합니다. 게시물을 편집했습니다. – robodisco

3

validates_presence_of :email, :if => :should_validate 

또는

validates_presence_of :email, :if => Proc.new { |user| user.signup_stage > 2 } 

희망 같은 것을 당신은을 사용하려면 :

다음 액티브를 사용하여 검증에 절 : 더러운 방법 경우
validates_presence_of :email, :if => Proc.new { |user| user.email_changed?} 

NB Rails 2.1 이상에서만 작동합니다.

관련 문제