2016-07-08 1 views
0

J'ai un DAO où je vérifie un nom d'utilisateur et je veux l'étendre pour vérifier le mot de passe, mais pour tester le but, je ne vérifie que pour le courrier électronique . Voici le DAO:Scala Slick 3 Correspondance du modèle de rappel de classe future

def authenticate(username: String, password: String): Future[Option[User]] = { 

    db.run(Users.filter(_.email === username).result).map(_.headOption) 
    } 

Maintenant, j'ai un formulaire avec la méthode de vérification implémentée. Je peux faire le rappel onSuccess et onFailue, mais je ne suis pas capable de faire onComplete. Actuellement, il est comme ceci:

val loginForm = Form(
    tuple(
     "username" -> nonEmptyText, 
     "password" -> nonEmptyText 
    ) verifying("Wrong username or password!", fields => fields match{ 
     case (username, password) => { 
     val query = userDao.authenticate(username, password) 

     query onComplete { 
      case Success(Option[User]) => println("Success") 
      case Failure(_) => println("Failed ") 
     } 

     false 
     } 
    }) 
) 

Ainsi, la classe Le succès est où le problème est, comme il est dit Pattern type is incompatible with expected type, found: Option.type, required Option[User]. Maintenant, comment résoudre cette erreur et comment puis-je récupérer le résultat de cette requête de sélection via slick? Le modèle est simple avec l'email et le mot de passe comme valeurs.

Merci pour l'aide

+0

double possible de [Puis-je faire la validation du formulaire de Async cadre de lecture 2.x (Scala)] (http://stackoverflow.com/questions/14913074/can-i -do-async-forme-validation-dans-play-cadre-2-x-scala) –

Répondre

1

Modifier cette ligne à

case Success(Some(user)) => println("Success") 
case Success(None) => println("User not found") 

noter cependant que onComplete est un peu comme l'enregistrement d'un rappel. Ce que vous voulez probablement faire est de mapper le résultat de votre requête et de le transformer en un booléen indiquant une connexion réussie ou un échec de connexion. Un troisième cas serait une exception du service (par exemple, une base de données non disponible).

La manière la plus simple de faire cela serait de faire une correspondance sur la Future[Option[User]] (requête, dans votre cas) et de vérifier si l'utilisateur a été trouvé dans la base de données. Cela se traduira par une Future[Boolean]:

query.map(_.isDefined) 
+0

Cela a du sens, j'ai utilisé certains mais n'a pas pensé à utiliser le deuxième cas, était très proche :). Mais j'ai encore quelques questions, comment puis-je récupérer les valeurs liées à l'utilisateur, comme le courrier électronique, userid, etc? Et si vous voulez dire un booléen, puis-je changer le type de retour de la méthode DAO à Future [Boolean]? Et, lié à ma dernière question, je ne pouvais pas comprendre ce query.map (_. IsDefined), où devrait-il être utilisé? – Maverick

+0

Peut-être que cette question pourrait vous aider: https://stackoverflow.com/questions/14913074/can-i-do-async-form-validation-in-play-framework-2-x-scala – rethab