Проверка существования числа в форме Play Scala

У меня есть форма, где ожидается число... Мне трудно проверить, было ли оно отправлено или нет, чтобы вернуть сообщение о том, что оно требуется, я пробовал следующие случаи, но ни один из них не работал:

"orderBy" -> number.verifying("The order is required",_.isInstanceOf[Int])

"orderBy" -> number.verifying("The order is required",_>0)

Есть идеи?

1 ответ

Решение

Если orderBy не представлен с Form вообще, тогда он вернет FormError с ключом error.required,

Я полагаю, вы имеете в виду случай, когда пустой String представляется вместо номера. Проблема ваших попыток в том, что verifying функции никогда не достигаются, потому что пустой String не проходит мимо number валидатор.

Единственное, о чем я могу думать, это сделать кастом Mapping[Int] сначала проверяет, является ли поле пустым, затем проверяет, является ли оно действительным Int,

val requiredNumber: Mapping[Int] = Forms.nonEmptyText
    .verifying("Must be numeric", i => Try(i.toInt).isSuccess || i.isEmpty)
    .transform[Int](_.toInt, _.toString)

И тестирование:

scala> val form = Form(mapping("orderBy" -> requiredNumber)(identity)(Some(_)))

scala> form.bind(Map("orderBy" -> "1")).value
res24: Option[Int] = Some(1)

scala> form.bind(Map("orderBy" -> "")).errors
res26: Seq[play.api.data.FormError] = List(FormError(orderBy,List(error.required),WrappedArray()))

scala> form.bind(Map("orderBy" -> "aa")).errors
res27: Seq[play.api.data.FormError] = List(FormError(orderBy,List(Must be numeric),WrappedArray()))

scala> form.bind(Map("orderByzzz" -> "2")).errors
res28: Seq[play.api.data.FormError] = List(FormError(orderBy,List(error.required),List()))
Другие вопросы по тегам