我遇到類型不匹配的問題。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無論如何。 –