gpt4 book ai didi

scala - Play Scala 激活器编译命令显示值 userid 不是 play.api.data.Form[models.Changepas sword] 的成员

转载 作者:行者123 更新时间:2023-12-01 13:52:21 24 4
gpt4 key购买 nike

我是框架新手(Scala),在我的项目中我需要更新新的Password 为此我需要获取user id 这是Primary 用户表的键。基于这个唯一的 user id 值,我将更新 Password

我需要什么

需要获取user表的user id值,并将此值传递给Controller的Action

我尝试过的

controllers/users.scala

 import play.api.mvc._
import play.api.data._
import play.api.data.Forms._
import views._
import models._


val changepasswordForm = Form(
mapping(
"userid" -> ignored(None:Option[Int]),
"password" -> tuple(
"main" -> text,
"confirm" -> text
).verifying(
// Add an additional constraint: both passwords must match
"Passwords don't match", passwords => passwords._1 == passwords._2
)
)(models.Changepassword.apply)(models.Changepassword.unapply)
)

def changePassword = Action {
Ok(html.changePassword(changepasswordForm))
}



def updatePassword(userid: Int) = Action { implicit request =>
changepasswordForm.bindFromRequest.fold(
formWithErrors => BadRequest(html.changePassword(formWithErrors)),
user => {
Changepassword.update(userid, user)
Ok("password Updated")
}
)
}

models/User.scala

case class Changepassword(
userid: Option[Int] = None,
password:(String,String)
)
object Changepassword{

val simple = {
get[Option[Int]]("user.USER_ID") ~
get[String]("user.PASSWORD") map {
case userid~password => Changepassword(userid, (password,password))
}
}
def update(userid: Int,changepassword:Changepassword) = {
DB.withConnection { implicit connection =>
SQL("update user set PASSWORD = {changepassword} where USER_ID = {userid}").
on('userid -> userid,
'changepassword -> changepassword.password._1)
.executeUpdate()
}
}
}

views/changePassword.scala.html

@(userForm: Form[Changepassword])

@import helper._

@implicitFieldConstructor = @{ FieldConstructor(twitterBootstrapInput.f) }

@main("") {

<h1>Change Password</h1>

@form(routes.Users.updatePassword(userForm.userid.get)) {

<fieldset>


@inputPassword(userForm("password.main"), '_label -> "New Password", '_help -> "",'placeholder -> "New Password")
@inputPassword(userForm("password.confirm"), '_label -> "Confirm Password", '_help -> "",'placeholder -> "Repeat Password")

</fieldset>

<div class="actions">
<input type="submit" value="Change password" class="btn primary"> or
<a href="@routes.Application.index()" class="btn">Cancel</a>
</div>

}

}

如果我运行 activator compile 命令,它会显示以下异常

D:\Jamal\test>activator compile
[info] Loading project definition from D:\Jamal\test\p
roject
[info] Set current project to scala-crud (in build file:/D:\Jamal\test/)
[info] Compiling 1 Scala source to D:\Jamal\test\targe
t\scala-2.11\classes...
[error] D:\Jamal\test\app\views\changePassword.sc
ala.html:11: value userid is not a member of play.api.data.Form[models.Changepas
sword]
[error] @form(routes.Users.updatePassword(userForm.userid.get)) {
[error] ^
[error] one error found
[error] (compile:compileIncremental) Compilation failed
[error] Total time: 13 s, completed Jun 11, 2015 3:52:19 PM

D:\Jamal\test>

最佳答案

不能将表单的值用作路由的参数:

@form(routes.Users.updatePassword(userForm.userid.get))

用户 ID 取决于表单,因此可能会发生变化。在任何情况下,您都可以使用 userForm("userid") 而不是 userForm.userid 访问表单的用户标识(尽管它可能不是您想要/需要的) .

解决您的问题的更好方法是像这样传递第二个参数:

Controller /用户.scala

 def changePassword =   Action {
val userId = ... get the current id ...
Ok(html.changePassword(changepasswordForm,userId))
}

views/changePassword.scala.html

@(userForm: Form[Changepassword], userId:Int)
...
...
@form(routes.Users.updatePassword(userId)) {
...
...
}
...

这样,您可以确保在显示页面时知道 userId,并且“恶意”用户无法通过操纵 userId 来更改其他用户的密码。

关于scala - Play Scala 激活器编译命令显示值 userid 不是 play.api.data.Form[models.Changepas sword] 的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30779423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com