ここでのコツは、この例Constraint
のようなカスタム ソートを定義することです。次に、カスタムを で使用して、フォーム内のフィールドをメソッドで検証できます。Constraint
Mapping[T]
verifying
カスタムには、またはのいずれかConstraint
を返すロジックが含まれています。エラー メッセージを結果に渡すことができます。ここで、データベースに重複または存在するものを指定できます。ValidationResult
Valid
Invalid
Invalid
カスタム検証のセクションについてはPlay for Scalaを参照してください。
- 制約を作成する
//Make this lazy to prevent java.lang.ExceptionInInitializerError at runtime.
lazy val uniqueNumbersConstraint = Constraint[String](Some("Unique numbers constraint"), "")(checkNumbers)
//"Business Logic".
//Important part here is that the function returns a ValidationResult and complies with the signature for Constraint. i.e. f: (T) => ValidationResult
//Return Valid if n in numbers is not in database and there are no duplicates.
//Otherwise return Invalid and an error message showing what numbers are in the database or duplicated.
def checkNumbers(numbers: String):ValidationResult = {
val splitNums = numbers.split(" ").toList.map(_.toInt)
val dbnums = splitNums.partition(database.contains(_))
if(dbnums._1.isEmpty && uniquesAndDuplicates(splitNums)._2.isEmpty){
Valid
}else{
val duplicates = uniquesAndDuplicates(dbnums._2)._2
val error = "Database contains: " + dbnums._1 + ", duplicated values: " + duplicates
Invalid(error)
}
}
- カスタム制約を使用してフォームを検証する
val helloForm = Form(
tuple(
"numbers" -> nonEmptyText.verifying(uniqueNumbersConstraint)
))
- ユーティリティ
//Return unique values on left side and duplicate values on right side
def uniquesAndDuplicates(numbers: List[Int]):Tuple2[List[Int], List[Int]] = {
numbers.partition(i => numbers.indexOf (i) == numbers.lastIndexOf(i))
}
def checkNum(num: Int) = {
database.contains(num)
}
val database = List(5,6,7)
- など
numbers
フォームで a として定義したことに注意してくださいString
。私がそれを定義したとき、list(number)
それは に評価され続けましたList()
。それは拘束力のある問題だと思います。動作する場合List(1,2,3)
の代わりに使用するのはかなり簡単な変更です。"1 2 3"
list(number)
- サンプル