2012-03-17 14 views
12

ho la seguente configurazione modello semplificato:Gioca accesso 2.0 richiedere nei modelli

  • principale (template)
    • Homepage
    • dettagli

Ora, quando un utente accede, un attributo di sessione username è impostato in modo che possa capire fuori se un utente è loggato o meno. Al fine di aiutarmi a capire se un utente è connesso o no, ho il seguente oggetto sessione di helper:

object SessionHelper { 
    val sessionKey = "username" 

    def authenticated(implicit request: RequestHeader) = { 
    request.session.get(sessionKey).exists(_ => true) 
    } 
} 

cui posso utilizzare in un modello che prende un oggetto implicit richiesta, ad esempio:

(implicit request: play.api.mvc.RequestHeader) 
... 
@if(SessionHelper.authenticated) { 
    <strong>Authenticated!</strong> 
} 
... 

Dal — per quanto posso dire — questo è l'unico modo per ottenere un implicito variabile in un template, significa che ovunque mi rendo vista, ho bisogno di esplicitamente "definire" la richiesta implicita variabile. Per esempio:

def index = Action { implicit request => 
    Ok(views.html.index(myStuff)) 
} 

Senza la dichiarazione implicit request =>, esso non viene compilato. Ora, mentre questo è un po 'imbarazzante, finché rimango in una delle "sotto-viste" (ad esempio Homepage o Dettagli) va bene perché per ognuna di queste visualizzazioni ho un metodo di controllo e come tale anche l'accesso implicito RequestHeader esempio. Tuttavia, quando ho bisogno di accedere alla sessione nel mio modello (ad esempio Main) questo non funziona perché non viene mai reso esplicitamente da un controller.

Non vedo immediatamente un modo per accedere alla sessione in un modello e un rapido Google non rivela molto altro che un paio di domande sullo stesso argomento senza risoluzione. Qualche idea?

Aggiornamento: sembra che questo sia in qualche modo correlato a this question.

risposta

8

Non c'è alternativa al passaggio della richiesta implicita su tutti i modelli, almeno non a partire da Play Framework 2.0.

Il collegamento aggiunto nell'aggiornamento è spostare più dati attorno ai modelli in un solo oggetto, ma è comunque necessario dichiarare il parametro implicito in qualsiasi punto.

2

Ho notato una cosa interessante: nella mia applicazione Java Play 2.1.0 posso usare oggetti impliciti elencati in Play 1.2.5 documentation, mentre non sono affatto documentati nella riproduzione 2! Probabilmente si tratta di una correzione di compatibilità all'indietro non documentata. In ogni caso, posso fare questo:

<li @if(request.uri == routes.Help.index.url){class="active"}> 

e questo:

@for((key, message) <- flash) { ... } 

Come potete vedere, posso usare request e flash variabili senza definire. My IntelliJ lo evidenzia costantemente come errore, ma lo compila e funziona comunque. Quindi sembra che alcune versioni successive alla 2.0 abbiano risolto questo problema.

+2

del gioco con il 2.3.x, ottengo "non trovato: richiesta di valore". – Wrench

+0

@Wrench: guarda la risposta di kaka, offre una spiegazione. In breve: è possibile avere alcuni impliciti disponibili. Scava in quella classe –

2

Se stai usando Play for Java, si può fare qualcosa a questo:

<li @if(requestHeader.uri == routes.Help.index.url){class="active"}> 

semplicemente ignorare l'errore nel vostro IDE, compila ed eseguire bene.

Il metodo requestHeader era importare automaticamente per classe play.TemplateImports:

javaImports.add("play.core.j.PlayMagicForJava._");