我遇到类型不匹配的问题。
类型不匹配;找到:需要选项[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))
)
}
答案 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
的更多信息。