2012-03-17 1 views
2

name 입력이 많은 검증이있다 : 그런 다음양식 필드에 다중 유효성 검사기가있는 경우 모두 검증하지 않고 하나씩 검증하도록하는 방법은 무엇입니까? 내가보기에 로그인 폼을

object Users extends Controller { 

    val loginForm = Form(tuple(
     "name" -> ( 
      nonEmptyText // (1) 
      verifying ("Its length should >= 4", name=>{ println("#222");name.length>=4 }) // (2) 
      verifying ("It should have numbers and letters", name=>{println("#333"); ...}) // (3) 
     ) 
} 

내가 눌러 입력하지 아무것도 제출하나요을, 나는 콘솔 인쇄 발견

#222 
#333 

즉 모든 검증 수행을 의미, 그들은 관계가 있습니다

(1) & (2) & (3) 

을하지만 나는 그들이 희망 :

(1) && (2) && (3) 

즉, 이름이 비어 있으면 나중에 두 개의 유효성 검사기가 무시됩니다.

play2에서 가능합니까?

답변

5

기본 동작은 필드에 정의 된 모든 제약 조건을 적용하는 것입니다.

def stopOnFirstFail[T](constraints: Constraint[T]*) = Constraint { field: T => 
    constraints.toList dropWhile (_(field) == Valid) match { 
    case Nil => Valid 
    case constraint :: _ => constraint(field) 
    } 
} 

그것은처럼 사용할 수 있습니다 다음과 같습니다 : 그러나 첫 번째 실패에 적용 제약을 중지하는 자신의 유효성 검사 제약 조건을 정의 할 수 있습니다

val loginForm = Form(
    "name" -> (text verifying stopOnFirstFail(
    nonEmpty, 
    minLength(4) 
)) 
) 
scala> loginForm.bind(Map("name"->"")).errors 
res2: Seq[play.api.data.FormError] = List(FormError(name,error.required,WrappedArray())) 

scala> loginForm.bind(Map("name"->"foo")).errors 
res3: Seq[play.api.data.FormError] = List(FormError(name,error.minLength,WrappedArray(4))) 

scala> loginForm.bind(Map("name"->"foobar")).errors 
res4: Seq[play.api.data.FormError] = List() 

(참고를 그 내 구현 stopOnFirstFail은 실패한 제약 조건을 두 번 적용하므로 부작용이 없어야합니다.

+0

내 관련 질문보기 : http://stackoverflow.com/questions/97 59660/how-to-define-a-stoponfirstfail-dsl-for-play2s-form – Freewind