19

劇中で!フレームワーク、scalaを使用して、次のようなフォームがあるとします:

import play.api.data._
import play.api.data.Forms._
import play.api.data.validation.Constraints._

case class User(someStringField: String, someIntField: Int)

val userForm = Form(
  mapping(
    "someStringField" -> text,
    "someIntField" -> number verifying(x => SomeMethodThatReceivesAnIntAndReturnsABoolean(x))
  )(User.apply)(User.unapply)

)

whereSomeMethodThatReceivesAnIntAndReturnsABooleanは、int に対して何らかのロジックを実行して検証するメソッドです。

someStringFieldただし、を検証するときにの値を考慮できるようにしたいのsomeIntFieldですが、プレイ フレームワークのフォームでこれを達成する方法はありますか? 私は次のようなことができることを知っています:

val userForm = Form(
  mapping(
    "someStringField" -> text,
    "someIntField" -> number 
  )(User.apply)(User.unapply)
.verifying(x => SomeFunctionThatReceivesAnUserAndReturnsABoolean(x))

そして、利用可能なユーザー インスタンス全体を検証関数に渡します。someIntFieldこのアプローチの問題は、結果として生じるエラーが、フィールドに関連付けられるのではなく、フォーム全体に関連付けられることです。

両方を取得し、別のフィールドを使用してフィールドを検証し、フォーム全体ではなく、検証したい特定のフィールドに関連付けられたエラーを維持する方法はありますか?

4

6 に答える 6

3

パラメータにプレフィックスを付けても構わない場合は、関連するパラメータをグループ化できます。

val aForm = Form(
mapping(
  "prefix" -> tuple(
    "someStringField" -> text,
    "someIntField" -> number
  ) verifying (tup => your verification)
)(tup => User.apply(tup._1, tup._2)(User.unapply...)

周囲のマッピングなしで似たようなものを使用します。適用/適用解除を少し調整し、引数を手動で渡してコンパイルする必要があります。

エラーは「prefix」グループに登録されます。

また、フォームを検証するときに FormError を使用したいフィールドにエラーを登録できないのも奇妙だと思います...

于 2013-08-02T22:41:45.937 に答える
2

Tom Myer のおかげで、ここで私が使用したもの

class MatchConstraint[A](val targetField:String, val map:(String, Map[String, String]) => A, val unmap:A => String) extends Formatter[A] {
  override def bind(key: String, data: Map[String, String]): Either[Seq[FormError], A] = {
    val first = data.getOrElse(key, "")
    val second = data.getOrElse(targetField, "")
    if (first == "" || !first.equals(second)) {
      Left(List(FormError(key, "Not Match!")))
    }
    else {
      Right(map(key, data))
    }
  }

  override def unbind(key: String, value: A): Map[String, String] = Map(key -> unmap(value))
}

そして、ここで私のフォームはどのように見えますか

val registerForm = Form(
  mapping(
    "email" -> email.verifying(minLength(6)),
    "password" -> text(minLength = 6),
    "passwordConfirmation" -> of(new MatchConstraint[String]("password", (key, data) => data.getOrElse(key, ""), str => str))
  )(RegisterData.apply)(RegisterData.unapply)
)
于 2015-01-20T06:50:40.823 に答える
0

ドキュメント: Playframework ドキュメント

次のコードを確認できます。 val userFormConstraintsAdHoc = Form( mapping( "name" -> text, "age" -> number )(UserData.apply)(UserData.unapply) verifying("Failed form constraints!", fields => fields match { case userData => validate(userData.name, userData.age).isDefined }) )

主に unapply 後に検証するだけで、すべてのフィールドがマップされているため、より完全な検証を行うことができます。

于 2015-03-09T08:54:55.260 に答える
0

彼らはscala-codeをJSR-Validationにマッピングしていると思います。そこは絶対に無理です。これを行うにはいくつかの議論があります。主に、検証は単純であるべきであり、複雑なロジックを作成するべきではありません。私はまだこれが恋しいです。play1 の Oval の方が良かったです。

于 2012-08-28T09:52:30.060 に答える