【问题标题】:"could not find implicit ... flash" in invoking nested view template调用嵌套视图模板时“找不到隐式 ... flash”
【发布时间】:2015-06-16 20:12:00
【问题描述】:

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

【问题讨论】:

  • @cchantep - 是的,我也看到了,确实有这个问题并修复了它 - 请注意控制器代码中的“request.flash”。但是,我无法弄清楚这个问题将如何映射到手头的问题上。你有什么具体的建议吗?为了它的价值,我尝试在控制器中添加行 implicit val flash = request.flash,但没有效果。

标签: scala playframework-2.0


【解决方案1】:

[Answering own post.] 这个问题的原因似乎是一些隐式值,例如“flash”,只能隐式地提供给顶级模板,因为它们是由一些隐式转换器提供的调用点的控制器。由于模板不继承自 Controller,因此当它们调用嵌套模板时,这些转换器超出了范围。

解决方案是将丢失的任何内容(如“flash”)显式传递给需要它的嵌套模板。所以“主”模板现在开始了:

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

我不知道为什么“lang”会隐式起作用。请注意,这是一个 Play-Compiler 错误,而不是 Scala 编译器错误;这可能是一个线索。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 2019-10-28
    • 2015-10-13
    • 2011-10-30
    • 1970-01-01
    相关资源
    最近更新 更多