Как сделать запрос JPA от просмотра шаблона в пьесе
-
29-09-2019 - |
Вопрос
Я пытаюсь сделать запрос JPA из шаблона представления, но он не работает (я подтвердил, что есть записи, использующие phpmyadmin). Я знаю, что это обычно делается через контроллер и передается через render
, но это часть создания меню, которое появится на каждой странице, и я не хочу изменять каждый контроллер для достижения этого.
Что я сейчас пытаюсь
<ul>
%{
import models.Building;
List<Building> buildings = Building.findAll();
}%
#{list items: buildings, as: 'building'}
<li><a href="">${building}</a></li>
#{/list}
</ul>
Но я получаю ошибку The template /app/views/Networks/grid.html does not compile : unexpected token: (
ссылаясь на линию, которая вызывает findAll()
. Анкет Какой правильный способ сделать это?
Решение
Вместо того, чтобы пытаться сделать это на странице (плохая практика) или добавить его на каждый контроллер, вы должны добавить его в один родительский контроллер в способе, аннотированном с @Before
. Анкет Это будет вызвано на каждую страницу, поэтому вам нужно сделать код только один раз.
Например. Родительский контроллер (ака перехватчик) выглядел бы:
public class ControllerInterceptor extends Controller {
@Before
public static void intercept() {
RenderArgs.current().put("buildings", Building.findAll());
}
}
Затем каждый контроллер добавит следующую аннотацию:
@With(ControllerInterceptor.class)
public class MyController extends Controller {
...
}
И ваш код страницы будет тогда ссылаться на это, как вы уже делаете:
<ul>
#{list buildings, as: 'building'}
<li>#{a @Buildings.edit(building.code)}${building}#{/a}</li>
#{/list}
</ul>
Что касается того, почему ваш оригинальный код не работал, я не уверен. Возможно, что-то связано с тем, как класс модели усилен игрой?
Другие советы
Обнаружил, как обойти это, но мне все еще интересно узнать, что не так с исходным кодом. Я получил это, просто делая
<ul>
#{list items: models.Building.findAll(), as: 'building'}
<li>#{a @Buildings.edit(building.code)}${building}#{/a}</li>
#{/list}
</ul>