Как сделать запрос JPA от просмотра шаблона в пьесе

StackOverflow https://stackoverflow.com/questions/4101734

  •  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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top