2016-07-08 11 views
0

私はユーザー名をチェックしてパスワードをチェックするためにDAOを使用していますが、これを初めてテストするために私は電子メールのみをチェックしています。ここにDAOがあります:Scala Slick 3将来のクラスコールバックパターンの一致

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

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

ここでは、検証方法が実装されたフォームがあります。私はOnSuccessとonFailueのコールバックを行うことができますが、私はonCompleteを行うことができません。 現在、それはこのようなものです:それはPattern type is incompatible with expected type, found: Option.type, required Option[User]を言うような問題は、ここで

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 
     } 
    }) 
) 

だから、成功のクラスがあります。 このエラーを解決する方法と、その選択クエリから結果を滑らかに取得するにはどうすればよいですか? モデルは電子メールとパスワードを値として単純です。

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

にオンラインヘルプのための

おかげ

+0

可能な重複[?私はプレイFrameworkの2.xで非同期フォームの検証を行うことができます(スカラ)](http://stackoverflow.com/questions/14913074/can-i:それは、Future[Boolean]になります –

答えて

1

変更は、しかしonCompleteのコールバックを登録似ていることに注意してください。おそらく、クエリの結果をマップし、成功したログインまたは失敗したログインを示すブール値に変換することです。 3番目のケースは、サービス(例えば、データベースが利用できない)による例外である。

これを行う最も簡単な方法は、Future[Option[User]](あなたの場合はクエリ)にマップして、そのユーザーがデータベースで見つかったかどうかを確認することです。

query.map(_.isDefined) 
+0

これは理にかなっていますが、私はいくつかを使用しましたが、2番目のケースを使用しないと思っていましたが、非常に近いです:)。しかし、私はまだいくつかの質問があります。電子メール、ユーザーIDなどのユーザー関連の値を取得するにはどうすればよいですか?そしてブール値を意味する場合は、DAOメソッドの戻り値の型をFuture [Boolean]に変更する必要がありますか?そして、私の最後の質問に関連して、私はこのquery.map(_。isDefined)を理解できませんでした。 – Maverick

+0

多分この質問はあなたを助けるかもしれません:https://stackoverflow.com/questions/14913074/can-i-do-async-form-validation-in-play-framework-2-x-scala – rethab