将随机值分配给表单

时间:2014-05-24 07:09:31

标签: forms scala random playframework playframework-2.2

我正在使用此代码将默认随机值分配给表单字段(“token”):

  val userForm = Form(
    mapping(
      "token" -> default(text, (randomString("0123456789abcdef")(40))),
      "username" -> optional(text),
      "email" -> email,
      "password" -> nonEmptyText,
      "gender" -> nonEmptyText
    )(User.apply)(User.unapply)
  )

似乎“令牌”随机值仅生成一次,之后永远不会更改。有什么方法可以解决这个问题吗?

3 个答案:

答案 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)))