Scala 如何使用play';s窗体验证以检查密码是否匹配

Scala 如何使用play';s窗体验证以检查密码是否匹配,scala,playframework,Scala,Playframework,我的表单如下所示: 案例类密码数据(currentPassword:String、newPassword:String、verifyPassword:String) 我的控制器操作遵循通常的模式: passwordForm.bindFromRequest.fold( error => {}, form => {} ) 现在的问题是,我需要验证输入的“currentPassword”是否与用户对象上的相同 userDao.getById(userId).password ==

我的表单如下所示:

案例类密码数据(currentPassword:String、newPassword:String、verifyPassword:String)

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

passwordForm.bindFromRequest.fold(
  error => {},
  form => {}
)
现在的问题是,我需要验证输入的“currentPassword”是否与用户对象上的相同

userDao.getById(userId).password == form.currentPassword
但我不能这样做,因为我不知道如何将用户名传递给我的表单定义,因为它是动态的

i、 我不能像这样做:

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

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

@if(form.hasGlobalErrors){
    @form.errors.foreach{error=>
  • @错误消息
  • }
}
没有什么可以阻止您将
密码表单
设置为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
而不是
foreach
foreach
返回
Unit
,它不会将任何内容打印到视图中

@if(form.hasGlobalErrors) {
    <ul>
        @form.globalErrors.map { error =>
          <li>@error.message</li>
        }
    </ul>
}
@if(form.hasGlobalErrors){
    @form.globalErrors.map{error=>
  • @错误消息
  • }
}
@m-z我想他说的是
密码
重新密码
…是的。。。他说。。。不知怎么错过了。嗯。。。应该以某种方式提供用户id。。。它是一个隐藏在表格中的文件。。。或者在用户会话中。@m-z它不是纯文本,我试图简化场景,因为如何匹配密码并不重要。我的会话对象中有userId,但我无法将其传递到表单中,因为这是一个值。当使用verify添加错误时,它们是否会进入全局错误?我的错误不显示(请参阅我的更新问题和我的错误显示代码)。如果它们在绑定函数之后,则为全局错误。不过,使用字段上的
nonEmptyText
也可以轻松完成此操作。我已编辑了我的答案,以便与您的原始表单更紧密地对齐。“密码不匹配”错误不会显示在任何位置。你知道为什么吗?
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 => ...
)
@if(form.hasGlobalErrors) {
    <ul>
        @form.globalErrors.map { error =>
          <li>@error.message</li>
        }
    </ul>
}