Подтвердить что ты не робот

Какие неявные объекты доступны по умолчанию для шаблонов?

Я пытаюсь создать плагин для Play Framework 2.0 (последний код в Github на сегодняшний день, 10 декабря 2011 г.). Плагин должен отображать некоторые данные в представлении. Чтобы не заставлять пользователей изменять все шаблоны, я создал тег, который будет извлекать и отображать соответствующие данные.

Чтобы избежать concurrency проблем, данные должны храниться вместе с идентификатором для пользователя. Этот идентификатор должен быть действительным только во время запроса (идентификатор сеанса, сам запрос и т.д.), После завершения запроса информация будет отброшена.

Проблема заключается в том, что ни один Request, RequestHeader и Session не доступны как неявные значения внутри шаблона Scala. Итак, , которые являются неявными значениями, доступными в шаблоне?

Если я не могу использовать, у вас есть какое-либо предложение о том, как получить значение, которое я могу получить от шаблонов и контроллеров (не требуя от пользователя изменения ни контроллера, ни шаблона) и который может быть сгенерирован в по запросу?

4b9b3361

Ответ 1

Да, это было проблемой для меня тоже...

Собственно, они могут иметь один implicit, но при этом вам нужно добавить его в список параметров и объявить необходимый объект как implicit в Действие.

Вот как я это сделал:

шаблон

// **FIRST** add the needed implicit parameter to the template (the whole template will be created as a function will the related parameters, incl. curryed parameters list are handled) 
@(stuff:models.MyStuff)(implicit request: play.api.mvc.Request[Any])

@import helper._

@main("Home"){

}

контроллер

object Main extends Controller {
  def index = Action {
    // **SECONDLY** declare the request as implicit.
    implicit request =>
      Ok(views.html.index(MyStuff()))
    }
}

Подробнее

Поскольку один единственный параметр implicit действителен, вы можете обернуть нужный объект в выделенную структуру и объявить его как implicit.

Ответ 2

Я нашел

все еще доступны, а неявные объекты errors, out, params и play из 1.x удалены. Похоже, что этот список определяется play.mvc.Http.Context.Implicit, чей javadoc говорит "Импортировать в шаблоны, чтобы получить неявный HTTP-контекст", Поэтому я уверен, что это полный список доступных автоматически.

Существует также @Messages вещь, которая заменяет неявный объект messages вместе с синтаксисом &{'my.message.key'} от 1.x. Это фактически сокращает вызов метода, а не является неявным объектом. Вы можете сделать @Messages("my.message.key"), который вызывает play.Messages.get(String, Object...), или вы можете заставить определенный язык с вещами например @Messages("index.title")(Lang("es")) или @Messages("index.title")(Lang("es-ar")), которые вызывают play.Messages.get(Lang, String, Object...).