【问题标题】:How to use play's form validation to check if the password matches如何使用 play 的表单验证来检查密码是否匹配
【发布时间】:2015-02-19 11:26:04
【问题描述】:

我的表格如下:

case class PasswordData(currentPassword: String, newPassword: String, verifyPassword: String)

val passwordForm = Form(
  mapping(
  )(PasswordData.apply)(PasswordData.unapply) verifying("Passwords do not match", fields => fields match {
    case data => (data.newPassword == data.verifyPassword)
})
)

我的控制器操作遵循通常的模式:

passwordForm.bindFromRequest.fold(
  error => {},
  form => {}
)

我现在遇到的问题是我需要验证输入的“currentPassword”是否与用户对象上的相同。

userDao.getById(userId).password == form.currentPassword

但我不能这样做,因为我不确定如何将他的 userId 传递给我的表单定义,因为它是动态的。

即我不能这样做:

"currentPassword" -> nonEmptyText.verifying(....)  // userId not in scope

更新

我也在尝试显示这些错误(它们当前不显示错误,我只看到 ul 标签)。

 @if(form.hasGlobalErrors) {
    <ul>
        @form.errors.foreach { error =>
        <li>@error.message</li>
        }
    </ul>
    }

【问题讨论】:

  • @m-z 我想他说的是passwordre-password...
  • 是的...他说...不知怎的错过了。
  • 嗯... user_id 应该以某种方式提供...无论是表单中的隐藏文件...还是在用户会话中。
  • @m-z 这不是纯文本,我试图简化场景,因为我如何匹配密码并不重要。我的会话对象中有 userId,但我无法将其传递到表单中,因为那是一个 val

标签: scala playframework


【解决方案1】:

没有什么能阻止您将 passwordForm 设为 def,您可以在其中传入用户模型。

def passwordForm(user: User) = Form(
  mapping(
    "currentPassword" -> nonEmptyText.verifying("Incorrect password.", enteredPassword =>
       // some comparison with `enteredPassword` and the user
    ),
    ...
  )(PasswordData.apply)(PasswordData.unapply)
    .verifying("Passwords do not match", data => 
       data.newPassword == data.verifyPassword
    )
)


passwordForm(user).bindFromRequest.fold(
  error => ...,
  form => ...
)

另外,要打印出视图中的全局错误,它们是通过globalErrors 访问的,而不是普通的errors 字段。您还应该使用map 而不是foreachforeach 返回Unit,它不会在视图中打印任何内容。

@if(form.hasGlobalErrors) {
    <ul>
        @form.globalErrors.map { error =>
          <li>@error.message</li>
        }
    </ul>
}

【讨论】:

  • 谢谢,使用验证添加错误时,它们会进入全局错误吗?我的错误不显示(请参阅我更新的问题和我的错误显示代码)。
  • 如果在绑定函数之后是全局错误。不过,您可以在现场使用nonEmptyText 轻松完成此操作。我已经编辑了我的答案,以更贴近您的原始表单。
  • “密码不匹配”错误不会在任何地方显示。任何想法为什么?
猜你喜欢
  • 2020-01-28
  • 2017-12-05
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 2015-08-30
  • 2015-12-06
  • 1970-01-01
  • 2019-05-04
相关资源
最近更新 更多