播放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.

我需要的

需要获取usertable的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 更改其他用户的密码。