默认值 class, Play Form

Default value in case class, Play Form

我有以下情况class:

case class User(id:String = UUID.random().toString, name:String)

以及以下创作形式:

val userForm = Form(
    mapping(
      "name" -> text
    )(User.apply)(User.unapply)
  )

但是随后表单抱怨 apply / unapply 函数没有足够的参数(缺少 id)。是否有任何解决方法,以便不重写案例 classes 的所有应用/取消应用函数并使用案例 class 的默认值?

当然这是一个例子,我的真实情况更复杂,有嵌套的 case class 列表,所以我真的很想使用 'automatic' case class 映射!

您可以使用 ignored:

val userForm = Form(
   mapping(
     "id" -> ignored(UUID.random()),
     "name" -> text
  )(User.apply)(User.unapply)
)

我喜欢使用 Option[String] 作为模型 类,而不是随机且无意义的 UUID 作为默认 ID;例如:

case class User(id:Option[String], name:String)

然后你可以使用optional映射:

val userForm = Form(
  mapping(
    "id" -> optional(text),
    "text" -> text,
  )
)

fold(或 match,无论你喜欢什么)在 id 上,当表单被提交回给你时,可能会在那个时候生成 UUID。

这样做的好处:

  • 表单是否已从默认值填充是完全显而易见的
  • 您可以将表格重新用于 "update my profile" 类型的操作,其中填充了 ID

您可以扩展@m-z 的解决方案,transform 忽略的值每次都生成随机 UUID

val userForm = Form(
  mapping(
    "id" -> ignored(()).transform[String](
      _ => UUID.random().toString,
      _ => ()),
    "name" -> text
  )(User.apply)(User.unapply)
)

此外,虽然您已经说过您不会重写 applyunapply,但我认为在某些情况下它仍然是可能的:

val userForm2 = Form(
  mapping(
    "name" -> text
  )(n => User(name = n))(u => User.unapply(u).map(_._2))
)