我遇到类型不匹配的问题。Scala类型不匹配
类型不匹配;发现:选项[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))
)
}
我怎么能强迫函数接受选项[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))
)
}
这里真正的问题就是为什么你的表单的成功价值是一个'Option [User]' - 说你有一个成功的登录表单提交但没有用户,这并没有多大意义。你可能想用你的'Form'定义来发布一个后续问题。 –
我对scala很新颖,并一直在思考这个问题。我的理由是'Form'定义应该带一个Option,因为signinForm使用一个用户函数'User.authenticate',它本身会吐出'Option [User]'。 'User.authenicate'通过电子邮件查询一个mongo数据库。如果找不到电子邮件,则返回None,否则将返回'Some(User)'。如果我错了,请纠正我。我编辑了我的原始帖子。 @TravisBrown – DrWolfe
如果认证失败,那么表单不会成功就更自然一些,如果不是,那么只返回一个'User' - 特别是因为你的'verifying'子句意味着你永远不会得到'None无论如何。 –