2012-09-01 73 views
3

我遇到类型不匹配的问题。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)) 
    ) 
    } 
+0

这里真正的问题就是为什么你的表单的成功价值是一个'Option [User]' - 说你有一个成功的登录表单提交但没有用户,这并没有多大意义。你可能想用你的'Form'定义来发布一个后续问题。 –

+0

我对scala很新颖,并一直在思考这个问题。我的理由是'Form'定义应该带一个Option,因为signinForm使用一个用户函数'User.authenticate',它本身会吐出'Option [User]'。 'User.authenicate'通过电子邮件查询一个mongo数据库。如果找不到电子邮件,则返回None,否则将返回'Some(User)'。如果我错了,请纠正我。我编辑了我的原始帖子。 @TravisBrown – DrWolfe

+1

如果认证失败,那么表单不会成功就更自然一些,如果不是,那么只返回一个'User' - 特别是因为你的'verifying'子句意味着你永远不会得到'None无论如何。 –

回答

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)最重要的事情是,如果有可能的是optUser实际上可能None,你所需要的单子安全的方式

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

找出在没有User对象的情况下你实际想要发生的事情。

如果您想了解更多信息,可以在其他StackOverflow问题中找到关于Option的更多信息。

+0

实现,我使用User.getUserName(user.get),因为我相信它永远不会是没有。 – DrWolfe