Какие неявные объекты доступны по умолчанию для шаблонов?
Я пытаюсь создать плагин для Play Framework 2.0 (последний код в Github на сегодняшний день, 10 декабря 2011 г.). Плагин должен отображать некоторые данные в представлении. Чтобы не заставлять пользователей изменять все шаблоны, я создал тег, который будет извлекать и отображать соответствующие данные.
Чтобы избежать concurrency проблем, данные должны храниться вместе с идентификатором для пользователя. Этот идентификатор должен быть действительным только во время запроса (идентификатор сеанса, сам запрос и т.д.), После завершения запроса информация будет отброшена.
Проблема заключается в том, что ни один Request, RequestHeader и Session не доступны как неявные значения внутри шаблона Scala. Итак, , которые являются неявными значениями, доступными в шаблоне?
Если я не могу использовать, у вас есть какое-либо предложение о том, как получить значение, которое я могу получить от шаблонов и контроллеров (не требуя от пользователя изменения ни контроллера, ни шаблона) и который может быть сгенерирован в по запросу?
Ответы
Ответ 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...).