播放Scala激活器编译命令显示值userid不是play.api.data.Form[models.Changepas剑的成员]
Play Scala activator compile command shows value userid is not a member of play.api.data.Form[models.Changepas sword]
我是框架新手(Scala),在我的项目中我需要更新新的 Password
为此我需要得到 user id
也就是 Primary key
user table
。基于这个独特的 user id
值,我将更新 Password
.
我需要的
需要获取user
table的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
访问表单的用户 ID(尽管它可能不是您 want/need)。
解决您的问题的更好方法是像这样传递第二个参数:
controllers/users.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)) {
...
...
}
...
这样,您可以确保在显示页面时知道用户 ID,并且 "evil" 用户无法通过操纵用户 ID 更改其他用户的密码。
我是框架新手(Scala),在我的项目中我需要更新新的 Password
为此我需要得到 user id
也就是 Primary key
user table
。基于这个独特的 user id
值,我将更新 Password
.
我需要的
需要获取user
table的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
访问表单的用户 ID(尽管它可能不是您 want/need)。
解决您的问题的更好方法是像这样传递第二个参数:
controllers/users.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)) {
...
...
}
...
这样,您可以确保在显示页面时知道用户 ID,并且 "evil" 用户无法通过操纵用户 ID 更改其他用户的密码。