2016-04-19 7 views
0

私はscala-playフレームワークが初めてです。私はPlayフレームワーク2.5とplay-slick 1.1.1を使用しています。私は、Actionを使用してリクエストを処理するとき、Future return型で混乱します。私registerUser方法で再生フレームワーク内のslick apiを使用して、一意の列値を持つmysqlにレコードを挿入する方法

found : scala.concurrent.Future[play.api.mvc.Result] required: play.api.mvc.Result

:私はこのエラーを取得しています。

これは、ここに私registerUser方法

def registerUser = Action.async { implicit request => 

registerForm.bindFromRequest.fold(

    errorForm => { 
    Future.successful(Ok(views.html.registration(errorForm))) 
    }, 

    user => { 
    userDal.isExists(user.email).map { isExists => 

     if(isExists.booleanValue() == false){ 
     Redirect(routes.UserController.login()).flashing("message"->"Invalid Credential") 
     } 
     **else{ 
      userDal.registerUser(user.firstname, user.lastname, user.email, user.password, user.address).map { _ => 

      Redirect(routes.ProductController.index()).withSession("username" -> user.firstname) 
     }** 
     } 
    } 
    } 
) 
} 

ある私のテーブルの投影とユーザテーブルにデータを挿入する方法があります。テーブル 'user'では、列 'email'に固有のマークが付きます。

表:

private class UserDB(tag: Tag) extends Table[User](tag, "user") { 

def id = column[Option[Int]]("id", O.PrimaryKey, O.AutoInc) 

def firstname = column[String]("firstname") 

def lastname = column[String]("lastname") 

def email = column[String]("email") 

def password = column[String]("password") 

def addr = column[String]("address") 

override def * = (id, firstname, lastname, email, password, addr) <> ((User.apply _).tupled, User.unapply) 
} 

方法は私も同じメールを持つユーザが存在するかどうかを確認する方法を持っているユーザテーブル

def registerUser(fname: String, lname: String, email: String, password: String, addr: String): Future[User] = db.run { 

(userTable.map(u => (u.firstname, u.lastname, u.email, u.password, u.addr)) 

    returning userTable.map(_.id) 
    // And we define a transformation for the returned value, which combines our original parameters with the 

    into ((column, id) => User(id, column._1, column._2, column._3, column._4, column._5))) += (fname, lname, email, password, addr) 
} 

に挿入します。 は、ここで私は「isExists」メソッドを通じて電子メールを既存のチェックされない場合は、それがユニークな制約のため、SQLExceptionをスローし

def isExists(email: String): Future[Boolean] = db.run{ 

userTable.filter(_.email === email).exists.result 
} 

方法です。

ありがとうございます。

+0

エラーの原因がわかりません。これがどこにスローされたかをメモすることができますか? メッセージからは、シンプルなタイプのエラーでもあります。メソッドのシグネチャを変更するか、または「Future」の値をマップする必要があります。 – jkinkead

+0

@jkinkeadさん、ありがとう、返信してください。 'registerUser'(先頭から1番目のメソッド)では、** code **にコードを入れました。これは問題のエラーを投げます。 – Govardhan

+0

'Future.successful'の最初の' Redirect'をラッピングしてみてください。あなたの 'if/else'の2つのブランチは異なるタイプになります。 – jkinkead

答えて

0

mapを使用するとエラーが発生します。 if/elseステートメントはFuture[Redirect]を生成しますが、mapコールはRedirectのインスタンスを必要とします。

この場合、最も簡単な解決策はmapflatMapに置き換えることです。この場合、Future[Redirect]のインスタンスが必要です。

関連する問題