【问题标题】:Assign random value to form为表格分配随机值
【发布时间】:2014-05-24 07:09:30
【问题描述】:

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

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

似乎“令牌”随机值只生成一次,之后就再也不会改变了。有什么办法解决这个问题?

【问题讨论】:

  • 我对@9​​87654322@ 没有那么丰富的经验,但是可以将这个val 更改为def 吗?喜欢:def userForm = Form(...)
  • 感谢 Kigyo,它确实适用于“def”,但它不会错过性能点吗?我不想在每个用户请求上创建一个新的 userForm 实例。

标签: forms scala random playframework playframework-2.2


【解决方案1】:

创建您自己的Mapping,这需要一个thunk。以下是由Formssource启发

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))),

【讨论】:

  • 感谢 ggovan,对不起,我不太了解 Scala 以使用您的示例。你能解释一下它是如何连接的吗?
  • 您只需在创建表单之前输入def defaultThunk,然后使用它代替default
  • 感谢 ggovan,我不完全理解,但效果很好!
【解决方案2】:

之所以这样,是因为你的表单是不可变的。

正如@Kigyo 在评论中所建议的那样,我也认为您可以尝试将其更改为功能,但是当您想从请求中绑定表单数据时,它会效率不高。

另一种解决方案是在表单上使用 fill 方法,如下所示:

userForm.fill(User((randomString("0123456789abcdef")(40)), None, "", "")

它将返回带有填充数据的新表单。您可以将该表单放入您的视图模板中。

但是,我不确定这是否是最好的解决方案......

【讨论】:

  • 谢谢。我没有帮助我,因为重点是使用以下方法将值分配给用户:userForm.bindFromRequest.fold
  • 我明白你的意思。但最终,如果您在视图中正确填充它,您将在绑定后也正确填充它。但是@ggovan 的想法更好:)。问候。
【解决方案3】:

或者你可以在你的模板中写成

 @inputText(userForm("token").copy(value=Some(randomString("0123456789abcdef")(40))))

或将随机字符串作为参数传递给模板并用作

@(userForm: Form[_], randStr)

 @inputText(userForm("token").copy(value=Some(randStr)))

【讨论】:

    猜你喜欢
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    相关资源
    最近更新 更多