如何使用play的表单验证来检查密码是否匹配
How to use play's form validation to check if the password matches
我的表格如下:
案例class密码数据(当前密码:字符串,新密码:字符串,验证密码:字符串)
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
但我不能这样做,因为我不确定如何将 int userId 传递给我的表单定义,因为它是动态的。
即我不能这样做:
"currentPassword" -> nonEmptyText.verifying(....) // userId not in scope
更新
我也在尝试显示这些错误(它们目前不显示错误,我只看到 ul 标签)。
@if(form.hasGlobalErrors) {
<ul>
@form.errors.foreach { error =>
<li>@error.message</li>
}
</ul>
}
没有什么可以阻止您将 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
而不是 foreach
。 foreach
returns Unit
,不会向视图打印任何内容。
@if(form.hasGlobalErrors) {
<ul>
@form.globalErrors.map { error =>
<li>@error.message</li>
}
</ul>
}
我的表格如下:
案例class密码数据(当前密码:字符串,新密码:字符串,验证密码:字符串)
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
但我不能这样做,因为我不确定如何将 int userId 传递给我的表单定义,因为它是动态的。
即我不能这样做:
"currentPassword" -> nonEmptyText.verifying(....) // userId not in scope
更新
我也在尝试显示这些错误(它们目前不显示错误,我只看到 ul 标签)。
@if(form.hasGlobalErrors) {
<ul>
@form.errors.foreach { error =>
<li>@error.message</li>
}
</ul>
}
没有什么可以阻止您将 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
而不是 foreach
。 foreach
returns Unit
,不会向视图打印任何内容。
@if(form.hasGlobalErrors) {
<ul>
@form.globalErrors.map { error =>
<li>@error.message</li>
}
</ul>
}