在调用嵌套视图模板时“找不到隐式... flash”

时间:2015-04-11 00:48:59

标签: scala playframework-2.0

请注意,“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或支持该理论的文档中找到任何内容。

1 个答案:

答案 0 :(得分:0)

[回答自己的帖子。]这个问题的原因似乎是某些隐含的值,例如" flash",只能隐式地提供给顶级模板,因为它们是由提供的Controller中的一些隐式转换器在调用时。由于模板不会从Controller继承,因此当它们调用嵌套模板时,这些转换器超出了范围。

解决方案是明确地将任何缺少的内容(例如" flash")传递给需要它的嵌套模板。所以"主要"模板现在开始:

@(title: String, flash:Flash)(content: Html)(implicit lang:Lang)

我不知道为什么" lang"隐含地工作。请注意,这是一个Play-Compiler错误,而不是Scala编译器错误;这可能是一个线索。