6

Ho il seguente codice in Play modello 2.0:Gioca 2.0 template - Scala `` match` e val` non si compila in un modello di vista

@content.toString.lines.map{ 
    case line =>  // i put `case` here as another attempt to make it work 
    line match { 
     case "" => @Html("") 
     case _ => <li>@Html(line)</li> /*CRASH*/ 
    } 
} 

Non riesce sulla linea marcata, dicendo che not found: value line. La seconda variante di esso:

@for(line <- content.toString.lines){ 
    @line match {       /*CRASH*/ 
     case "" => @Html("") 
     case _ => <li>@Html(line)</li> 
    } 
} 

fallisce sulla linea marcata, sostenendo che 'case' expected but identifier found.

UPDATE:

Stessa cosa vale per val:

@val headID = "head" 

esce con illegal start of simple expression.

UPDATE FINISCE

Vorrei sapere, che cosa sto facendo di sbagliato e come implementare correttamente la struttura match-case e val assegnazione nei modelli di giocare?

risposta

22

Utilizzando match espressioni nei template

È necessario racchiudere tra parentesi graffe (“{” e “}”) il contenuto HTML dei tuoi modelli:

@for(line <- content.toString.lines) { 
    @line match { 
    case "" => { } 
    case _ => { <li>@Html(line)</li> } 
    } 
} 

Nel vostro caso specifico, il seguente codice sarebbe leggere meglio IMHO:

@content.toString.lines.collect { 
    case line if !line.isEmpty => { <li>@Html(line)</li> } 
} 

valori che definiscono

È possibile definire i valori utilizzando il defining[T](value: T)(usage: T => Html) aiutante:

@defining(1 + 2 * 3) { value => 
    <div>@value</div> 
} 
1

seguente sembra funzionare per me

@content.toString.lines.map{ line => 
    line match { 
     case "" => @Html("") 
    case _ => <li>@Html(line)</li> 
} 

duro con gli occhi, ma si può guardare target/scala-2.9.1/src_managed/main/views/html/index.template.scala nella directory del progetto di gioco per vedere che cosa la sua messa in stringhe letterali.

Per quanto riguarda l'assegnazione val, non lo so, ma @defining può aiutare

4

ho scoperto che aggiungere un {} esterno per racchiudere tutto il codice avrebbe funzionato

@{content.toString.lines.map{ line => 
    line match { 
    case "" => @Html("") 
    case _ => <li>@Html(line)</li> 
}} 
+0

Lifesaver! Dopo aver grattato la testa per oltre un'ora su questo, ho scoperto che anche questo ha funzionato. Totalmente inaspettato visto che ho altri file all'interno dello stesso progetto, praticamente identici nella struttura, che non hanno bisogno di questa e l'unica differenza possibile è che sto usando un campo di un parametro che viene passato al contrario di un parametro passato (@xf contro @x) TUTTAVIA ho modificato il codice e ho provato a passare direttamente il param e non si sarebbe ancora compilato. Anche se potrebbe essere .xml contro .html e questo non ha fatto la differenza.Grazie per la risposta! – Techmag

+0

In un caso di qualcosa di al di sopra bizzarro che avevo iniziato a compilare all'improvviso - era errato con le parentesi graffe (cure miracolose) e poi quando li ho rimossi i nuovi errori sono andati via ma l'intero file è stato compilato in modo pulito. Ho cercato rapidamente di annullare tutti i cambiamenti che avevo apportato nell'ultimo paio d'ore o giù di lì per vedere se potevo ottenere un colpo sul vero colpevole qui, ma senza successo. Ti suggerirei di scavare più a fondo se questo ti accade mentre le parentesi graffiano in qualche modo un problema più profondo. – Techmag

0

Un'altra causa frequente di questo errore è quello di avere la parentesi iniziale su una riga separata:

@x match { 
case y => 
    { //offending brace, put it back on the same line as case 
    } //This can go anywhere 
} 
Problemi correlati