找不到参数 flash 的隐式值
Posted
技术标签:
【中文标题】找不到参数 flash 的隐式值【英文标题】:Could not find implicit value for parameter flash 【发布时间】:2011-10-17 01:12:14 【问题描述】:我正在尝试将一些代码从 Play Framework Java 移植到 Play Framework Scala,但在移植标签时遇到了一些问题。
Java 版本中的相关标签检查 Flash 范围的内容并根据其值(错误、成功等)向用户创建通知。
我尝试创建一个 Scala 视图 (flag.scala.html
):
@()(implicit flash:play.mvc.Scope.Flash)
@if(flash.get("error"))
<p style="color:#c00">
@flash.get("error")
</p>
我从main.scala.html
打来电话:
@views.Application.html.flag()
我得到的错误是:
文件 module:./tmp/generated/views.html.main.scala 不能 编译。引发的错误是:找不到隐含值 参数flash:play.mvc.Scope.Flash
对新标签的调用是正确的,就好像我用浏览器中显示的某个字符串替换了内容一样。
我确定这很愚蠢,但我被卡住了。有什么建议吗?
【问题讨论】:
【参考方案1】:我不知道 Play 的详细信息,但这个编译错误是说你应该:
在对flag()
的调用中传递play.mvc.Scope.Flash
的显式实例,
views.Application.html.flag()(myFlash)
或
使Flash
的隐式实例在调用flag()
的范围内可用。您可以通过导入某个对象 (import some.path.FlashImplicits._
) 的内容或自己定义隐式实例来做到这一点,
implicit val myFlash: play.mvc.Scope.Flash = ...
...
views.Application.html.flag()
所以真正的问题变成了:你想从哪里得到这个Flash
实例?
【讨论】:
是的,第二个修复与 Play 完美配合:@()(implicit flash:play.mvc.Scope.Flash = play.mvc.Scope.Flash.current()) 的标签声明变量。谢谢一百万先生! 看起来你选择了选项#3:给隐式参数一个默认值。这也有效。请注意,您实际上并不需要在此处将其设为“隐式”,但这并没有什么坏处。乐于助人。【参考方案2】:您不应自行创建“隐式闪存:Flash”的实现。只需在您的操作中添加“隐式请求”即可。
更多详情在页面末尾:https://github.com/playframework/Play20/wiki/ScalaSessionFlash
【讨论】:
我添加了隐式请求,但它不起作用..当我尝试使用隐式闪存时,它也不起作用..玩起来很麻烦,尤其是每个次要版本都有变化跨度> 【参考方案3】:Ivan 提出了正确的建议,添加了“隐式请求”。但是,他的链接似乎已过时。如果您想要更明确的解释,请在此处查看我对类似问题的回答:
How to pass flash data from controller to view with Play! framework
【讨论】:
【参考方案4】:我有同样的问题,但查看文档我发现以下内容:
如果错误“找不到参数 flash 的隐含值”: play.api.mvc.Flash' 被提出然后这是因为你的动作没有 导入请求对象。添加“隐式请求=>”
当然,如果您有如下嵌套视图,则隐式 Flash 必须出现在每个视图中:
@(implicit flash: Flash)
@main()<h1>hello</h1>
此视图不使用 flash 作用域,但如果 main 使用它,则应在使用 main 的视图中声明,因为编译器会报错。
来源:http://www.playframework.com/documentation/2.1.1/ScalaSessionFlash
【讨论】:
以上是关于找不到参数 flash 的隐式值的主要内容,如果未能解决你的问题,请参考以下文章
Scala 类型参数化,Shapeless - 找不到参数 Generic 的隐式值