3

タイプの不一致に問題があります。

型の不一致; 見つかった: オプション [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))
        )
      }

関数が Option[models.User] を受け入れるように強制するにはどうすればよいですか、または models.User を Option に変換できますか?

ここでエラーが発生します: 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))
    )
  }
4

1 に答える 1

4

を にオプション解除するOption[User]Userは、次のいずれかを実行できます。

1) 安全でない方法。ではないことが確実な場合にのみ、これを行ってください。optUserNone

val optUser: Option[User] = ...
val user: User = optUser.get

2) 安全な方法

val optUser: Option[User] = ...
optUser match {
  case Some(user) => // do something with user
  case None => // do something to handle the absent user
}

3) モナドの安全な方法

val optUser: Option[User] = ...
optUser.map(user => doSomething(user))

最大のことは、optUser実際に可能である場合、オブジェクトNoneがない場合に実際に何をしたいのかを理解する必要があるということです。User

Optionもっと読みたい場合は、他の StackOverflow の質問にもっと多くの情報があります。

于 2012-09-01T23:58:25.943 に答える