Scala case类、Play Form中的默认值
我有以下案例课程:Scala case类、Play Form中的默认值,scala,playframework,playframework-2.0,Scala,Playframework,Playframework 2.0,我有以下案例课程: case class User(id:String = UUID.random().toString, name:String) 以及以下创作形式: val userForm = Form( mapping( "name" -> text )(User.apply)(User.unapply) ) 但是表单抱怨apply/unapply函数没有足够的参数(id丢失)。是否有任何解决方法,以避免重写case类的所有apply/unapp
case class User(id:String = UUID.random().toString, name:String)
以及以下创作形式:
val userForm = Form(
mapping(
"name" -> text
)(User.apply)(User.unapply)
)
但是表单抱怨apply/unapply函数没有足够的参数(id丢失)。是否有任何解决方法,以避免重写case类的所有apply/unapply函数并使用case类的默认值
当然,这是一个例子,我的真实案例更复杂,有嵌套的案例类列表,所以我真的很想使用“自动”案例类映射 您可以使用
忽略:
val userForm = Form(
mapping(
"id" -> ignored(UUID.random()),
"name" -> text
)(User.apply)(User.unapply)
)
您可以使用忽略的
:
val userForm = Form(
mapping(
"id" -> ignored(UUID.random()),
"name" -> text
)(User.apply)(User.unapply)
)
对于模型类,我喜欢使用选项[String]
,而不是将随机和无意义的UUID作为默认ID;e、 g:
case class User(id:Option[String], name:String)
然后,您可以使用可选的映射:
val userForm = Form(
mapping(
"id" -> optional(text),
"text" -> text,
)
)
和折叠
(或匹配
,无论您喜欢什么)在id
上,当表单提交给您时,可能会在那时生成UUID
这样做的好处:
- 表单是否是从默认值填充的是非常明显的
- 您可以将该表单重新用于“更新我的配置文件”类型的操作,其中会填充ID
我喜欢对模型类使用选项[String]
,而不是将随机和无意义的UUID作为默认ID;e、 g:
case class User(id:Option[String], name:String)
然后,您可以使用可选的映射:
val userForm = Form(
mapping(
"id" -> optional(text),
"text" -> text,
)
)
和折叠
(或匹配
,无论您喜欢什么)在id
上,当表单提交给您时,可能会在那时生成UUID
这样做的好处:
- 表单是否是从默认值填充的是非常明显的
- 您可以将该表单重新用于“更新我的配置文件”类型的操作,其中会填充ID
您可以扩展@m-z的解决方案,并转换被忽略的值,每次生成一个随机的UUID
:
val userForm = Form(
mapping(
"id" -> ignored(()).transform[String](
_ => UUID.random().toString,
_ => ()),
"name" -> text
)(User.apply)(User.unapply)
)
此外,尽管您已经指出,您不需要重写应用
和不应用
,但我认为在某些情况下,也有可能:
val userForm2 = Form(
mapping(
"name" -> text
)(n => User(name = n))(u => User.unapply(u).map(_._2))
)
您可以扩展@m-z的解决方案,并转换被忽略的值,每次生成随机UUID
:
val userForm = Form(
mapping(
"id" -> ignored(()).transform[String](
_ => UUID.random().toString,
_ => ()),
"name" -> text
)(User.apply)(User.unapply)
)
此外,尽管您已经指出,您不需要重写应用
和不应用
,但我认为在某些情况下,也有可能:
val userForm2 = Form(
mapping(
"name" -> text
)(n => User(name = n))(u => User.unapply(u).map(_._2))
)
不幸的是,每个请求的UUID都是相同的。。。所以它不适合我的情况:/不幸的是,每个请求的UUID都是相同的。。。因此,这不适合我的情况:/但这是一个设计缺陷,因为我的api用户可能会指定自己的id,这可能不是期望的行为,但这是一个设计缺陷,因为我的api用户可能会指定自己的id,这可能不是你想要的,非常感谢先生!!!我使用了第二个解决方案,这个解决方案非常详细,但仍然保持干净,并尊重我的奇数约束,使用case类中的默认值!再次非常感谢!非常感谢,先生!!!我使用了第二个解决方案,这个解决方案非常详细,但仍然保持干净,并尊重我的奇数约束,使用case类中的默认值!再次非常感谢!