1

解決策: Option[User] の非存在を返す方法を理解できなかったので、ユーザーが見つからない場合は、ダミーのユーザー オブジェクトを作成し、コントローラーからそれを推論します (ひどい感じですが、機能しています...) : Application.scala から

val loginForm = Form(
tuple(
  "email" -> text,
  "password" -> text
) verifying ("Invalid email or password", result => result match {
  case (email, password)  => (User.authenticate(email, password).map{_.id}.getOrElse(0) != 0)
})

)

とは対照的に:

val loginForm = Form(
  tuple(
  "email" -> text,
  "password" -> text
) verifying ("Invalid email or password", result => result match {
  case (email, password) => User.authenticate(email, password).isDefined
})

)

++++++++++++++++++ オリジナル2 ++++++++++++++++++ アドバイスありがとうございます!私はいくつかの変更を行い、近づいているようですが、未定義のオプション[ユーザー]を返す方法がわかりません。case _ => null も試しました。以下を参照してください。

User.scala から

case class User(id: Int, email: String, name: String, password: String)

object User {

  // -- Parsers

  /**
   * Parse a User from a ResultSet
   */
  val userParser = {
            get[Option[Int]]("uid")~        
            get[Option[String]]("email")~
            get[Option[String]]("fname")~
            get[Option[String]]("pbkval") map {
            case (uid~email~name~pbkval) => validate(uid,email, name, pbkval)
            }
  }

  /**
   * Retrieve a User from email.
   */
  def findByEmail(email: String): Option[User] = {
    DB.withConnection { implicit connection =>
      SQL("select * from get_pbkval({email})").on(
                'email -> email         
            ).as(userParser.singleOpt)
    }
  }


  /**
   * Authenticated user session start.
   */
  def authenticate(email: String, password: String): Option[User] = {
    DB.withConnection { implicit connection =>
      SQL(
            """
                        select * from get_pbkval({email})
            """
            ).on(
                'email -> email
            ).as(userParser.singleOpt)

        }
    }

  /**
   * Validate entry and create user object.
   */
    def validate(uid: Option[Int], email: Option[String], fname: Option[String], pbkval: Option[String]): User = {
                val uidInt : Int = uid.getOrElse(0)
                val emailString: String = email.getOrElse(null)
                val fnameString: String = fname.getOrElse(null)
                val pbkvalString: String = pbkval.getOrElse(null)
                User(uidInt, emailString, fnameString, pbkvalString)
    }

ここで基本的なことを実際に得ていないことは明らかだと思います.. http://www.playframework.org/modules/scala-0.9.1/anormを読み、何時間も検索しました..どんな助けもとても有難い!

4

1 に答える 1

3

マップする行を指定していません。行マッパーの後に * を付けて、マップする行を示します。そうしているうちに、行マッパーを別の val で定義する方が簡単だとわかりました。このようなもの。

 val user = { 
   get[Option[Int]]("uid")~        
   get[Option[String]]("email")~
   get[Option[String]]("fname")~
   get[Option[String]]("pbkval") map {
    case uid~email~name~password => validate(uid,email, name, password)
  }
}

def authenticate(email: String, password: String): Option[User] = {
DB.withConnection { implicit connection =>
  SQL(
    """
        select * from get_pbkval({email})
    """
    ).on(
        'email -> email
    ).as(user *)
  }
 } 

    def validate(uid: Option[Int], email: Option[String], fname: Option[String], pbkval: Option[String]): Option[User] = {
    if (uid != None) {
            val uidInt : Int = uid.getOrElse(0)
            val emailString: String = email.getOrElse(null)
            val fnameString: String = fname.getOrElse(null)
            val pbkvalString: String = pbkval.getOrElse(null)
            User(uidInt, emailString, fnameString, pbkvalString)
    } else { return null}
}

「as」メソッドには 2 つの引数があることに注意してください。行マッパー (現在は val 「ユーザー」として定義されています) と、すべての行をマップすることを示す「*」です。

于 2012-07-30T15:42:10.437 に答える