案例类,播放表单中的默认值

时间:2016-03-03 21:56:50

标签: 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)
  )

然后Form抱怨apply / unapply函数没有足够的参数(缺少id)。是否有任何解决方法,以便不重写案例类的所有apply / unapply函数并使用案例类的默认值?

当然这是一个例子,我的实际案例对于案例类的嵌套列表来说更复杂,所以我真的想使用'自动'案例类映射!

3 个答案:

答案 0 :(得分:2)

你可以扩展@ m-z的解决方案,并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))
)

答案 1 :(得分:1)

您可以使用ignored

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

答案 2 :(得分:0)

我喜欢使用Option[String]作为模型类,而不是随机且无意义的UUID作为默认ID。 e.g:

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

然后您可以使用optional映射:

val userForm = Form(
  mapping(
    "id" -> optional(text),
    "text" -> text,
  )
)
当表单提交给您时,fold上的

match(或id(或strAccept = "a b c def ghijk lm n"; strReject = "a b cd ef g"; function isOkay(str) { return str.indexOf(' ') == -1 && str.indexOf(' ') >= 0; } console.log(isOkay(strAccept)) console.log(isOkay(strReject)) ,无论您喜欢什么),可能在那时生成UUID。

这样做的好处:

  • 表格是否已从默认值中填充
  • ,这一点非常明显
  • 您可以重新使用该表单来更新我的个人资料"类型的操作,其中填充了ID