2016-03-03 105 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,這可能不是所需的行爲 –