2012-09-01 77 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