2016-03-03 149 views
0

我有以下情况下类:默认值,播放形式

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

而下面的创作形式:

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

但随后形式抱怨申请/取消应用功能没有足够的参数(id缺失)。是否有任何解决方法,以便不重写案例类的所有apply/unapply函数并使用案例类的默认值?

当然这是一个例子,我的真实案例更复杂,嵌套的案例类列表,所以我真的很喜欢使用'自动'案例类映射!

回答

2

您可以@ MZ的解决方案延伸,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)) 
) 
+0

谢谢很多先生!我使用了第二种解决方案,它非常冗长,但仍保持清洁,并尊重我使用我的案例类中的默认值的奇怪约束!再次感谢! –

1

您可以使用ignored

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

不幸的是这将是相同的UUID对于每一个请求...所以它不适合我的情况:/ –

0

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

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

然后你可以使用optional映射:

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

fold(或match,不管你喜欢)的id时提交表单回到你身边,也许产生的UUID那时候。

  • 它是完全明显无论是形式已经从默认值填充
  • 您可以重新使用“更新我的个人资料”型的操作形式,其中ID:做这种方式的

    优势填充

+0

但它是一个设计缺陷,因为它可能会为我的API的用户指定自己的ID,这可能不是所需的行为 –