我将实现一个关于登录验证的简单方法。 validate是一个POST路由
def validate: play.api.mvc.Action[play.api.mvc.AnyContent] = Action {
implicit request ⇒
var isSuccess: Some[Boolean] = Some(false)
val data = login_Form.bindFromRequest().get
models.user.validate(data.name, data.psd).map(ccc =>
if (ccc) {
Logger.info("1.1")
isSuccess = Some(true)
} else {
Logger.info("1.2")
isSuccess = Some(false)
}
)
if (isSuccess.get) {
Logger.info("2.1")
Ok(views.html.index.render())
} else {
Logger.info("2.2")
Ok(views.html.login("Login failed"));
}
}
models.user.validate返回一个Future(布尔值),但它没有让我的想法成真。日志只打印2.2然后无法登录。我不知道我的问题是什么。我在Play2.4,Scala 2.11.7,sbt 0.13.8中执行此操作,并在typesafe Activator中运行该应用程序。
答案 0 :(得分:0)
未来将在未来得到解决。
因此,您在其上运行的代码(在map
中)不会立即执行。
你必须
同时将Ok
来电转移到map
(并使用您的方法return a Future[Result]
instead of the Result
directly)或
Await.result
你的booolean(阻止调用,等待验证调用完成)
其他观察:
isSuccess
是可选的(不仅仅是一个简单的Boolean
)?var
。希望在您知道后将解析后的值分配给val
,而不是使用临时占位符初始化var
。get
,更好地处理数据丢失的情况未经测试的重写:
def validate = Action.async { implicit request ⇒
login_Form.bindFromRequest() match {
case Some(data) => models.user.validate(data.name, data.psd).map(okay =>
if (okay) {
Logger.info("1.1")
Ok(views.html.index.render())
} else {
Logger.info("1.2")
Ok(views.html.login("Login failed"));
}
)
case None =>
Future.successful(Ok(view.html.login("Invalid form posted"))
}
}