默认值 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)
)
此外,虽然您已经说过您不会重写 apply
和 unapply
,但我认为在某些情况下它仍然是可能的:
val userForm2 = Form(
mapping(
"name" -> text
)(n => User(name = n))(u => User.unapply(u).map(_._2))
)
我有以下情况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)
)
此外,虽然您已经说过您不会重写 apply
和 unapply
,但我认为在某些情况下它仍然是可能的:
val userForm2 = Form(
mapping(
"name" -> text
)(n => User(name = n))(u => User.unapply(u).map(_._2))
)