1

我一直在学习和玩 Scala,同时我一直在努力学习 Play!尤其是 Scala 版本的播放。

我了解对象的应用方法,甚至了解将代码块传递给 Trait 或 Class。但在所有示例中,动作代码块示例类似于:

def index = Action {
Ok("Got request [" + request + "]")
}

所以在这里我们使用 Action-companion object helper 并且我们将代码块传递给这个伴随对象 apply-function ?

但我不明白“请求”从哪里填充?这是我在 Scala 中遇到的问题,一些“神秘”的魔法刚刚发生,但我需要理解它。:)

因此,如果有人可以向 Scala 和 Play 解释这一点!新手您的帮助将不胜感激。

4

1 回答 1

4

它实际上并不那么神奇(至少在这种情况下)。控制器接收请求并产生响应。在 Play 中,如果您不需要访问或使用任何请求信息,您可以这样写:

def index = Action {
   Ok("hello, world")  // Not using the request!
}

但是您编写的代码(截至目前)实际上不会编译,因为正如您所说,没有给出请求。相反,您需要这样做:

def index = Action { request =>
  Ok("Got request [" + request + "]")
}

即请求是返回a Result(the Ok) 的函数的参数。

是的,你是对的,它相当于写:

def index = Action.apply({ request =>
  Ok("Got request [" + request + "]")
})

或者更明确地说:

def myAction[T]: (Request[T] => Result) = request => Ok("Got request [" + request + "]")

def index = Action.apply(myAction)

index不是直接返回响应的函数。它是框架调用以获取请求处理程序的函数(Action)。然后可以使用传入请求调用该处理程序以产生响应。


还有其他变化。默认情况下,请求的内容(即正文)作为通用处理AnyContent。如果您想以某种特定方式显式解析正文,例如作为 JSON,您可以将 aBodyParser作为第一个(curried)参数传递:

def index = Action(myBodyParser) { request =>
  Ok("Got request [" + request + "]")
}

注意:使请求成为隐式参数是很常见的,例如,它会自动传递给模板:

def index = Action { implicit request =>
  Ok(views.html.mypage())
}

对于一些模板代码,例如:

@()(implicit request: RequestHeader)

<h1>I was called at @request.path</h1>
于 2013-09-19T18:41:37.320 回答