Какие неявные объекты доступны по умолчанию в шаблонах? - PullRequest
12 голосов
/ 11 декабря 2011

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

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

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

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

Ответы [ 2 ]

7 голосов
/ 03 июля 2012

Я нашел

все еще доступны, в то время как неявные объекты 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 ...) .

5 голосов
/ 18 января 2012

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

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

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

template

// **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"){

}

controller

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

More?

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

...