我有一个_flash
子模板:
@(flash: Flash)
@flash.data.foreach { x =>
@x._1, @x._2
}
此代码从不显示任何Flash消息。下面的代码不起作用
@if(!flash.isEmpty) {
@for((msgKey, msgValue) <- flash) {
<div class="alert alert-@msgKey" data-dismiss="alert">
<a title="@Messages("misc.message.close")" class="close">×</a>
@msgKey
</div>
}
}
由于运行时出错:filter is not a member of Flash
。奇怪的是,下面的代码确实可以工作并显示一条消息:
@flash.get("success")
我如何设置消息并不重要,因为它在最后一种情况下运行良好,但是,它有代码:
if (success) {
Redirect(routes.Application.success).flashing("success" -> "Ok123")
} else {
Ok(views.html.registration.add(newForm))
}
我的目标是循环闪存,因为它希望在_flash
子模板中显示所有消息。
更新:我意识到为什么第一种方法不起作用(我必须使用地图)。但是为什么第二个会在运行时引发错误?
答案 0 :(得分:3)
语法错误,您错过了闪存。数据。从Play 2.0 API开始,我们看到Flash是
case class Flash (data: Map[String, String]) extends Product with Serializable
所以正确的代码应该是:
@if(!flash.isEmpty) {
@for((msgKey, msgValue) <- flash.data) {
<div class="alert alert-@msgKey" data-dismiss="alert">
<a title="@Messages("misc.message.close")" class="close">×</a>
@msgKey
</div>
}
}
我几乎可以肯定这是编译时错误,您只能在运行时看到它,因为您使用了开发模式。 顺便说一句,我通常做这样的事情:
@()(implicit flash: play.api.mvc.Flash)
@flash.get("success").map { message =>
<div class="alert alert-success alert-dismissable">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
@message
</div>
}
@flash.get("failure").map { message =>
<div class="alert alert-danger alert-dismissable">
<a class="close" data-dismiss="alert">×</a>
@message
</div>
}