1

我有以下 play2 代码:

  implicit def contextToRequest(rc: RequestContext[_]) = rc.request
  implicit def contextToFlash(rc: RequestContext[_]) = rc.request.flash
  implicit def contextToSession(rc: RequestContext[_]) = rc.request.session

  def login: Action[AnyContent] = PublicAction { implicit rc =>
    Ok(html.login(loginForm))
  }

RequestContext是我自己的 Play2 自定义类包装器Request

我的 scala 视图开始于:

@(form: Form[(String,String,Boolean)])(implicit flash: Flash, session: Session,rc: utils.RequestContext[_])

但是编译器说:

找不到参数 flash 的隐式值:play.api.mvc.Flash

有人可以向我解释为什么它不起作用吗?也许我们不能对隐式参数使用隐式转换?

那么有人可以向我解释为什么已经存在从 Play2 请求到 Session/Flash 的隐式转换,而当我这样做时它不起作用?

4

2 回答 2

1

当您最终拥有多个隐式参数(其中一些是其他参数的成员属性)时,您的设计就有问题。

class B
class C

class A {
  val b:B = _
  val c:C = _ 

}

def myMethod(someData:String)(implicit a:A, b:B, c:C) {

}

实际上,您希望在方法中包含该 A 的 B 和 C 成员。但是,通过这样的签名,可以提供与该 A 无关的给定 A 和 B 和 C。正确的签名如下

  def myMethod(someData:String)(implicit a:A) {
    // trick to import members variable
    import a._
    println(b)
    println(c)
  }
于 2012-08-09T09:53:33.903 回答
0

嗯,它似乎适用于:

implicit def contextToRequest(implicit rc: RequestContext[_]) = rc.request

而且我不需要其他两种方法,因为会有歧义,因为 Play2 已经提供了 Request 到 Flash/Session 的隐式转换

于 2012-08-08T18:51:46.000 回答