Динамические маршруты на шаблонах Play Framework 2.1

Взяв образец компьютерной базы данных Java в качестве отправной точки в Play! 2.1 Я разрабатываю серверную часть CRUD для примерно 20 моделей. Проблема, с которой я сталкиваюсь, - это повторение на уровне шаблона одних и тех же функций снова и снова.

Я попытался реорганизовать функцию ссылки как:

@****************************************
* Helper generating navigation links    *
****************************************@
@link(newPage:Int, newSortBy:String) = @{
    // Generate the link
    controllers.admin.routes.Model.index(newPage, "id", newSortBy)
}

Что-то вроде

@(controller: Any, newPage: Int, newSortBy: String)
any.index(newPage, "id", newSortBy)

Поскольку обратные маршрутизаторы не наследуются от какого-либо определенного класса, я не могу сделать это в общем виде. И предыдущий код не работает, так как я не выполняю приведение типов (я полагаю, поскольку ошибка компилятора "значение индекса не является членом Any")

Можно ли как-нибудь получить список определенных маршрутов во время выполнения? Не имеет значения, находится ли он в шаблоне Scala или на стороне Java, таким образом я могу передать имя контроллера и получить правильный обратный маршрутизатор для создания URL.

Если это невозможно, то как правильно реорганизовать весь тот код, который повторяется снова и снова по шаблонам, особенно те, которые зависят от ReverseRouters.

1 ответ

Я не нашел способа получить список маршрутизаторов и реверсивных маршрутизаторов динамически, но я нашел способ ограничить количество кода базовой платы и иметь возможность рефакторинга шаблонных функций в свои собственные файлы, делая код более управляемым,

Я обнаружил, что Scala - это не другой способ сказать Java!!! В частности, вы можете передать функции в качестве параметра функции ( http://oldfashionedsoftware.com/2008/08/23/fun-with-scala-functions/), так что вы можете передать часть кода, которая будет выполнена на подшаблоне из основного шаблона (вид DI).

В приведенном мной примере проблема заключалась в передаче обратного контроллера в подшаблоны из основного шаблона, но "обратные контроллеры" не расширяют какой-либо конкретный объект. Код в примерах:

template.scala.html

...
...
@****************************************
* Helper generating navigation links    *
****************************************@
@link(newPage:Int, newSortBy:String) = @{
    // Generate the link
    controllers.admin.routes.MyController.index(newPage, "id", "asc")
}
...
...
@**********************************
* Helper generating table headers *
***********************************@
@header(key:String, title:String) = {
    <th class="">
        <a href="@link(0, key)">@title</a>
    </th>
}
...
...

Реорганизовать header функция в свой собственный шаблон, я должен быть в состоянии вызвать link функция. Использование включений из переработанного файла не будет работать, поскольку обратный контроллер жестко задан в link функция. Решение состоит в том, чтобы извлечь header Функция для подшаблона и определить параметр шаблона, который будет функцией:

просмотров / Utils / header.scala.html

@(key: String, title:String, link: (Int) => Html)
    <th class="@key">
        <a href="@link(0)">@title</a>
    </th>

А теперь в шаблоне:

просмотров / админ / template.scala.html

...
@import utils._
...
@link(newPage:Int) = {
    @controllers.admin.routes.MyController.index(newPage, "id", "asc")
}
...
@header("key", "title", link _)
...

Теперь мне нужно только определить link Функция для каждого из основных шаблонов и передать его в качестве параметра для любых подшаблонов, которые нуждаются в этом. Не полностью чистая, но значительно уменьшает котельную плиту и облегчает смену шаблона.

Надеюсь, что это помогает другим. Лучшее решение кто-нибудь?

Другие вопросы по тегам