3

我遇到类型不匹配的问题。

类型不匹配; 找到:Option[models.User] 必需:models.User

def authenticate = Action { implicit request =>
        signinForm.bindFromRequest.fold(
          formWithErrors => BadRequest(html.signin(formWithErrors)),
          user => Redirect(routes.Application.active).withSession(Security.username -> User.getUserName(user))
        )
      }

如何强制函数接受 Option[models.User] 或者我可以将 models.User 转换为 Option?

错误发生在这里:User.getUserName(user)。getUserName 需要模型。用户类型。

================================================

使用所有使用的代码进行更新:

来自 User.scala

  def authenticate(email: String, password: String) : Option[User] = {
    (findByEmail(email)).filter { (user => BCrypt.checkpw(password, user.password)) }
  }

  def findByEmail(email: String) : Option[User] = {
    UserDAO.findOne(MongoDBObject("email" -> email))
  }

来自 Application.scala

  val signinForm = Form {
    mapping(
      "email" -> nonEmptyText, 
      "password" -> text)(User.authenticate)(_.map(user => (user.email, "")))
      .verifying("Invalid email or password", result => result.isDefined)
  }

  def authenticate = Action { implicit request =>
    signinForm.bindFromRequest.fold(
      formWithErrors => BadRequest(html.signin(formWithErrors)),
      user => Redirect(routes.Application.active).withSession(Security.username -> User.getUserName(user.get))
    )
  }
4

1 回答 1

4

要将 an 取消选择Option[User]为 a User,您可以执行以下操作之一:

1)不安全的方式。仅当您确定不是optUser时才这样做None

val optUser: Option[User] = ...
val user: User = optUser.get

2)安全的方式

val optUser: Option[User] = ...
optUser match {
  case Some(user) => // do something with user
  case None => // do something to handle the absent user
}

3)一元安全方式

val optUser: Option[User] = ...
optUser.map(user => doSomething(user))

最重要的是,如果有optUser可能None,你需要弄清楚在没有User对象的情况下你真正想要发生的事情。

Option如果您想了解更多信息,请参阅其他 StackOverflow 问题中的更多信息。

于 2012-09-01T23:58:25.943 回答