4

如何仅在创建对象时应用 Play 2 唯一性验证?我可以添加一个自定义verifying子句,但是在编辑(而不是创建)现有对象时它会失败。

4

2 回答 2

1

如果您没有对版本和创建执行相同的验证检查,也许这意味着您不应该Form对两者使用相同的对象?实际上,只有少数特殊情况可以Form在现实世界的程序中使用相同的对象进行创建和编辑。

另一方面,如果您不想复制一些对创建和编辑都通用的验证逻辑,您可以在两个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 回答