请注意,“flash not found in Products.scala”中描述的问题并不相同,并且已经得到解决。
“Play for Scala”一书中的第2章演练包括一个“editProduct.scala.html”,内容如下:
@(productForm: Form[Product]) (implicit flash:Flash, lang:Lang)
@import helper.twitterBootstrap._
@main(Messages("products.form")){
...
}
}
Play 2.3.8编译器出错:
Error:(4, 33) Play 2 Compiler:
.../editProduct.scala.html:4: could not find implicit value for parameter flash: play.api.mvc.Flash
@main(Messages("products.form")){
^
我认为这意味着由于某种原因,第一行的“flash”不能令人满意地调用第4行的“main”模板。“main”模板以:
开头@(title: String)(content: Html)(implicit flash: Flash, lang: Lang)
我认为它不相关,但调用此表单的控制器代码为:
import play.api.mvc._
import models.Product
import play.api.data.Form
import play.api.data.Forms.{mapping,longNumber,nonEmptyText}
import play.api.i18n.Messages
object Products extends Controller {
...
def newProduct = Action { implicit request =>
val form = if (request.flash.get("error").isDefined)
productForm.bind(request.flash.data)
else
productForm
Ok(views.html.products.editProduct(form))
}
...
}
有人可以提出任何建议吗?这本书基于Play Framework 2.1,我使用的是2.3.8,因此它可能是某种版本依赖 - 但我无法在SO或支持该理论的文档中找到任何内容。
答案 0 :(得分:0)
[回答自己的帖子。]这个问题的原因似乎是某些隐含的值,例如" flash",只能隐式地提供给顶级模板,因为它们是由提供的Controller中的一些隐式转换器在调用时。由于模板不会从Controller继承,因此当它们调用嵌套模板时,这些转换器超出了范围。
解决方案是明确地将任何缺少的内容(例如" flash")传递给需要它的嵌套模板。所以"主要"模板现在开始:
@(title: String, flash:Flash)(content: Html)(implicit lang:Lang)
我不知道为什么" lang"隐含地工作。请注意,这是一个Play-Compiler错误,而不是Scala编译器错误;这可能是一个线索。