gpt4 book ai didi

scala - 如何将闪存数据从 Controller 传递到 Play! 中查看框架

转载 作者:行者123 更新时间:2023-12-02 20:31:38 25 4
gpt4 key购买 nike

我一直在玩游戏!到目前为止,学习曲线上有一些坎坷。现在我无法将闪存数据从 Controller 传递到 View ,起初我认为这是一项微不足道的任务,或者至少应该如此。

这是我现在拥有的:

我有一个主布局:application.scala.html

我有一个布局中的 View :login.scala.html

我有我的 Controller 和方法:UX.authenticate() - 我希望它根据登录尝试的结果(成功与失败)向 View 提供闪存数据

这是我的 Controller 方法中的代码:

def authenticate = Action { implicit request =>
val (email, password) = User.login.bindFromRequest.get
// Validation
// -- Make sure nothing is empty
if(email.isEmpty || password.isEmpty) {
flash + ("message" -> "Fields cannot be empty") + ("state" -> "error")
Redirect(routes.UX.login())
}
// -- Make sure email address entered is a service email
val domain = email.split("@")
if(domain(1) != "example.com" || !"""(\w+)@([\w\.]+)""".r.unapplySeq(email).isDefined) {
flash + ("message" -> "You are not permitted to access this service") + ("state" -> "error")
Redirect(routes.UX.login())
} else {
// Attempt login
if(AuthHelper.login(email, password)) {
// Login successful
val user = User.findByEmail(email)
flash + ("message" -> "Login successful") + ("state" -> "success")
Redirect(routes.UX.manager()).withSession(
session + (
"user" -> user.id.toString
)
)
} else {
// Bad login
flash + ("message" -> "Login failed") + ("state" -> "error")
Redirect(routes.UX.login())
}
}
}

在我的登录 View 中,我有一个参数:@(隐式 flash: Flash)

当我尝试使用 flash 时,使用 @flash.get("message") 不会出现任何内容

理想情况下,我想在布局中设置@(implicit flash: Flash),这样我就可以从任何 Controller 刷新数据并将其到达我的 View 。但每当我这样做时,登录 View 都会抛出错误。

现在在我的登录 View 中我有这个:

def login = Action { implicit request =>
flash + ("message" -> "test")
Ok(views.html.ux.login(flash))
}

将闪存数据传递到 View 的理想方式是什么?是否有示例? Play 上的例子!框架文档没有任何帮助,并且仅限于两个完全不显示与 View 交互的示例(位于底部: http://www.playframework.com/documentation/2.0/ScalaSessionFlash )。

有更简单的选择吗?我究竟做错了什么?如何将 Flash 数据直接传递到我的布局 View ?

最佳答案

如果您在文档中查找 Session and Flash scopes你会看到这个代码片段:

def save = Action {
Redirect("/home").flashing(
"success" -> "The item has been created"
)
}

现在,将其与您对闪光灯瞄准镜的使用进行比较:

flash + ("message" -> "Login successful") + ("state" -> "success")

这种用法的问题是闪存是不可变的,您无法重新分配它。此外,通过您在此处的使用,您实际上是在创建一个新的 flash 变量,只是没有使用它。

如果您将其稍微修改为:

implicit val newFlash = flash + ("message" -> "Login successful") + ("state" -> "success")
Redirect(...)

它会起作用的。但是,首选用法是对结果使用 .flashing() 方法。该方法来自 play.api.mvc.WithHeaders,这是一个混合到 play.api.mvc.PlainResult 中的特征,各种结果方法(Ok、Redirect 等)都继承自该特征。

然后,如文档中所示,您可以访问模板中的 Flash 范围:

@()(implicit flash: Flash) ... 
@flash.get("success").getOrElse("Welcome!") ...

编辑:啊,好的。我已经查看了您的示例代码,现在我明白您想要做什么。我认为您真正寻找的是处理表单提交的规范方法。查看约束定义here在文档中,我想您会发现有更好的方法来完成此任务。本质上,您需要在支持表单的元组上使用 verifying 方法,以便 bindFromRequest 将无法绑定(bind),并且验证错误可以传递回 View :

loginForm.bindFromRequest.fold(
formWithErrors => // binding failure, you retrieve the form containing errors,
BadRequest(views.html.login(formWithErrors)),
value => // binding success, you get the actual value
Redirect(routes.HomeController.home).flashing("message" -> "Welcome!" + value.firstName)
)

关于scala - 如何将闪存数据从 Controller 传递到 Play! 中查看框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15531455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com