我有以下案例类:
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函数并使用案例类的默认值?
当然这是一个例子,我的实际案例对于案例类的嵌套列表来说更复杂,所以我真的想使用'自动'案例类映射!
答案 0 :(得分:2)
你可以扩展@ m-z的解决方案,并transform
忽略的值,每次都产生一个随机的UUID
:
val userForm = Form(
mapping(
"id" -> ignored(()).transform[String](
_ => UUID.random().toString,
_ => ()),
"name" -> text
)(User.apply)(User.unapply)
)
此外,虽然您已经注意到您不会重写apply
和unapply
,但我认为在某些情况下它可能仍然是可能的:
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。
这样做的好处: