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类中的默认值!再次非常感谢!