Scala类型不匹配

时间:2012-09-01 22:57:59

标签: scala mongodb playframework playframework-2.0

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

类型不匹配;找到:需要选项[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转换为选项?

此处发生错误:User.getUserName(user)。 getUserName需要models.User类型。

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

使用所有代码进行更新:

来自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))
    )
  }

1 个答案:

答案 0 :(得分:4)

要取消选择Option[User]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)monadic安全的方式

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

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

如果您想阅读更多内容,其他StackOverflow问题中有关于Option的更多信息。