如何使用play的表单验证来检查密码是否匹配

Bla*_*man 2 scala playframework

我的表格如下:

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)
})
)
Run Code Online (Sandbox Code Playgroud)

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

passwordForm.bindFromRequest.fold(
  error => {},
  form => {}
)
Run Code Online (Sandbox Code Playgroud)

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

userDao.getById(userId).password == form.currentPassword
Run Code Online (Sandbox Code Playgroud)

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

即我不能这样做:

"currentPassword" -> nonEmptyText.verifying(....)  // userId not in scope
Run Code Online (Sandbox Code Playgroud)

更新

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

 @if(form.hasGlobalErrors) {
    <ul>
        @form.errors.foreach { error =>
        <li>@error.message</li>
        }
    </ul>
    }
Run Code Online (Sandbox Code Playgroud)

Mic*_*jac 5

没有什么能阻止你制作你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 => ...
)
Run Code Online (Sandbox Code Playgroud)

此外,要打印视图中的全局错误,可以通过globalErrors而不是正常errors字段访问它们.你也应该用map而不是foreach.foreach返回Unit,不会向视图打印任何内容.

@if(form.hasGlobalErrors) {
    <ul>
        @form.globalErrors.map { error =>
          <li>@error.message</li>
        }
    </ul>
}
Run Code Online (Sandbox Code Playgroud)