Domanda

Sto cercando di fare una query JPA da un modello di vista, ma non funziona (ho verificato che ci sono record utilizzando phpMyAdmin). So che questo dovrebbe di norma essere fatto attraverso il controller e passò in via render, ma questo è parte della costruzione di un menu che apparirà in ogni pagina e non voglio dover modificare ogni controller per raggiungere questo obiettivo.

Quello che sto attualmente cercando è

<ul>
%{
    import models.Building;
    List<Building> buildings = Building.findAll();
}%
#{list items: buildings, as: 'building'}
    <li><a href="">${building}</a></li>
#{/list}
</ul>

, ma sto ottenendo il The template /app/views/Networks/grid.html does not compile : unexpected token: ( errore che fa riferimento la linea che chiama findAll(). Qual è il modo giusto per fare questo?

È stato utile?

Soluzione

Invece di cercare di farlo nella pagina (pratica cattivo) o aggiungerlo a ogni controller si dovrebbe aggiungere a un controller genitore in un metodo annotato con @Before. Questo verrà chiamato in ogni pagina in modo che solo è necessario fare il codice una volta.

Eg. Il controller genitore (aka intercettore) sarà simile:

public class ControllerInterceptor extends Controller {
   @Before
   public static void intercept() {
      RenderArgs.current().put("buildings", Building.findAll());
   }
}

Quindi ogni controller dovrebbe aggiungere la seguente annotazione:

@With(ControllerInterceptor.class)
public class MyController extends Controller {
...
}

E il codice pagina sarebbe quindi fare riferimento ad esso quanto si sta già facendo:

<ul>
    #{list buildings, as: 'building'}
    <li>#{a @Buildings.edit(building.code)}${building}#{/a}</li>
    #{/list}
</ul>

Per quanto riguarda il motivo per cui il codice originale non ha funzionato, non sono sicuro. Forse qualcosa a che fare con come la classe del modello è esaltata da Play?

Altri suggerimenti

Scoperto come lavorare intorno ad esso, ma mi piacerebbe essere ancora interessati a sapere che cosa era sbagliato con il codice originale. Ho ottenuto che funziona da solo facendo

<ul>
    #{list items: models.Building.findAll(), as: 'building'}
    <li>#{a @Buildings.edit(building.code)}${building}#{/a}</li>
    #{/list}
</ul>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top