我正在使用此代码将默认随机值分配给表单字段(“token”):
val userForm = Form(
mapping(
"token" -> default(text, (randomString("0123456789abcdef")(40))),
"username" -> optional(text),
"email" -> email,
"password" -> nonEmptyText,
"gender" -> nonEmptyText
)(User.apply)(User.unapply)
)
似乎“令牌”随机值仅生成一次,之后永远不会更改。有什么方法可以解决这个问题吗?
答案 0 :(得分:2)
创建自己的Mapping
,它需要一个thunk。以下内容由Forms
source 启发
def defaultThunk[A](mapping: Mapping[A], value: =>A): Mapping[A] =
OptionalMapping(mapping).transform(_.getOrElse(value), Some(_))
由于value
用于匿名函数,因此应每次调用它,并给出不同的随机数。
所以不要使用
"token" -> default(text, (randomString("0123456789abcdef")(40))),
改为使用:
"token" -> defaultThunk(text, (randomString("0123456789abcdef")(40))),
答案 1 :(得分:0)
就是这样,因为你的表单是不可变的。
正如@Kigyo在评论中建议的那样,我也认为您可以尝试将其更改为功能,但是当您希望在此之后需要绑定表单数据时,它将无效。
另一个解决方案是在表单上使用 fill 方法,类似:
userForm.fill(User((randomString("0123456789abcdef")(40)), None, "", "")
它将返回带有填充数据的新表单。您可以将该表单添加到视图模板中。
但是,我不确定这是否是最佳解决方案......
答案 2 :(得分:0)
或者,您可以将模板写为
@inputText(userForm("token").copy(value=Some(randomString("0123456789abcdef")(40))))
或将randomString作为参数传递给模板并用作
@(userForm: Form[_], randStr)
@inputText(userForm("token").copy(value=Some(randStr)))