我不能在playframework的视图中使用flash

时间:2014-09-02 14:41:41

标签: scala playframework implicit

这是我的观点代码:

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

<html>
  <head>
    <title>.: @title :.</title>
  </head>
  <body>
    ...
      @flash.get("message").getOrElse("Welcome ;)")
    ...
  </body>
</html>

但是当我尝试这个时,在我的控制器中:

def main = Action { implicit req =>
   Ok(views.html.main("First Page"))
}

我收到此错误:

could not find implicit value for parameter flash: play.api.mvc.Flash

如果我理解了correclty,在这种情况下,“request2flash”方法(来自Controller)必须创建一个隐含的flash值......但为什么它不起作用?

在另一种情况下,当我尝试这个时:

def main = Action { implicit req =>
   implicit val flash = req.flash
   Ok(views.html.main("First Page"))
}

我收到此错误:

ambiguous implicit values:
 both method request2flash in trait Controller of type (implicit request: play.api.mvc.RequestHeader)play.api.mvc.Flash
 and value flash of type play.api.mvc.Flash
 match expected type play.api.mvc.Flash

更新

我正在使用带有Scala 2.11.1和Play 2.3.3的Typesafe Activator(1.2.8)。

道歉

请原谅我。我有2个具有相似路径的对象,其中一个对请求参数没有“隐式”定义。我在4小时后释放了它。谢谢大家。

1 个答案:

答案 0 :(得分:0)

我无法使用Scala 2.11.2和Play 2.3.3重现您的问题。以下代码为我编译,表明implicits正在运行:

object App extends Controller {
  def flashy = Action { implicit req =>
  val flash = implicitly[Flash]
  Ok("")
}

有一种方法可以让您的代码进行编译。 Implicits只是第二个参数列表,因此您可以明确地提供它们:

def main = Action { req =>
  Ok(views.html.main("First Page")(request2lang(req), request2flash(req)))
}

当然,这不能替代找到并解决问题的原因!

更新:

我刚刚注意到您正在呼叫views.html.main而不是views.html.index。这不会编译,因为views.html.main有一个额外的参数列表(content: Html)。这无疑是你问题的原因。