質問: Form( mapping( "userId" -> nonEmptyText .verifying("No User Auth", bid => userId.isEmpty || db.auth(userId).isDefined) )(UserForm.apply)(UserForm.unapply) ) ``` 想定通りの動作はするのですが、非常に冗長的になってしまっています。 今まで、Java版を利用してプログラムを利用していたのですが、Java版の場合、validation メソッドの中に、 記述すれば、細かく記載できたのですが、Scala版の勝手がいまいちわかりません。 上記、条件が満たされるような Validationのシンプルな書き方があれば、 ご教授いただけないでしょうか? お手数をおかけしますが、よろしくお願い致します。
回答: `Constraint` を記述して `def verifying(constraints: Constraint[T]*): Mapping[T]` の方を使うと良いのではないでしょうか。 verifying で指定した Constraint は途中でエラーが見つかっても全て評価されるため、最初のエラーで中断したい場合には1つの Constraint にチェックを詰める必要があります。 nonEmptyText の実装は `text verifying Constraints.nonEmpty` となっているので、`Constraints.nonEmpty` を利用すると次のようになると思います。 ``` import play.api.data.validation.{Constraint, Constraints, Invalid, Valid} val constraint = Constraint[String] { string => Constraints.nonEmpty(string) match { case invalid: Invalid => invalid case Valid => if (/* チェック1 */) { Invalid("check1 error") } else if (/* チェック2 */) { Invalid("check2 error") } else { Valid } } } text.verifying(constraint) ```