4

オブジェクトが作成されているときにのみPlay2の一意性検証を適用するにはどうすればよいですか?カスタムverifying句を追加することはできますが、既存のオブジェクトを(作成するのではなく)編集すると失敗します。

4

2 に答える 2

1

編集と作成で同じ検証チェックを実行していない場合、Form両方に同じオブジェクトを使用すべきではないということでしょうか? Form実際には、実際のプログラムで作成と編集の両方に同じオブジェクトを使用することが理にかなっている特定のケースはごくわずかです。

一方、作成と編集の両方に共通する検証ロジックを複製したくない場合は、2 つのFormオブジェクトでマッピング フラグメントを再利用できます。

val commonMapping = "common" -> tuple(
    "foo" -> number,
    "bar" -> nonEmptyText
)
val creationForm = Form(tuple(
    commonMapping,
    "baz" -> date
) verifying (/* creation specific constraint */))
val editionForm = Form(tuple(
    commonMapping,
    "bah" -> boolean
))
于 2013-01-13T17:43:39.170 に答える
0

より良い解決策がわからないため、コントローラーでこの回避策を実行しています。

ご想像のとおり、 isNew 値は作成のケースをチェックします。私の場合は天気が seq (作成の場合は 0) が URL 経由で渡されます。

メソッド userExists(userName: String): Boolean は、一意性をチェックします。

val boundForm = userForm.bindFromRequest()

if(!boundForm.hasErrors) {
  val user = boundForm.get // save as form has no errors
  if(isNew && userExists(user.getUsername)) {
    boundForm = boundForm.copy(value = None, errors = Seq(FormError("", "user exists, choose another name")))
  }
}

boundForm.fold(...,...)
于 2013-01-11T12:36:26.180 に答える