2012-12-22 13 views
7

Come è possibile visualizzare un errore di convalida per un campo modulo al di fuori di un costruttore campo in Play Framework 2? Ecco quello che ho provato:Come stampare l'errore di convalida al di fuori del costruttore di campo in Play framework 2

@eventForm.("name").error.message 

E ottengo questo errore:

value message is not a member of Option[play.api.data.FormError] 

Sono confuso perché nel api docs si dice messaggio è un membro della FormError. Anche questo funziona bene per errori globali:

@eventForm.globalError.message 

risposta

7

si può ottenere una migliore comprensione di esso verifica Form's sourcecode here

Form definisce un metodo di applicare:

def apply(key: String): Field = Field(
    this, 
    key, 
    constraints.get(key).getOrElse(Nil), 
    formats.get(key), 
    errors.collect { case e if e.key == key => e }, 
    data.get(key)) 

Che, come detto nel documento, restituisce qualsiasi campo, anche se non esiste . E un Field ha un errors membro che restituisce un Seq[FormError]:

Quindi, si potrebbe fare qualcosa di simile (per la Seq[FormError]):

eventForm("name").errors.foreach { error => 
    <div>@error.message</div> 
} 

Or (per la Option[FormError])

eventForm("name").error.map { error => 
    <div>@error.message</div> 
} 

Oppure, è possibile utilizzare Formerrors:

def errors(key: String): Seq[FormError] = errors.filter(_.key == key) 

E ottenere tutti gli errori di una determinata chiave. Ti piace questa (per la Seq[FormError]):

eventForm.errors("name").foreach { error => 
     <div>@error.message</div> 
} 

Or (per la Option[FormError])

eventForm.error("name").map { error => 
      <div>@error.message</div> 
} 

Se volete maggiori dettagli, controllare il codice sorgente. È ben scritto e ben commentato.

Cheers!

EDIT:

Come biesior commentato: per mostrare umani graziose messaggi leggibili con diverse lingue che si controlla come funziona il gioco I18N fuori here

Per essere approfondita probabilmente stai andando ad avere per trattare con I18N. Non è affatto difficile far funzionare tutto. Dopo aver letto il documentation potresti ancora trovarti un po 'consussato. Ti darò una piccola spinta.Aggiungi un file messages alla tua cartella conf ed è possibile copiarne il contenuto da here. In questo modo avrai più controllo sui messaggi predefiniti. Ora, a suo avviso, si dovrebbe essere in grado di fare qualcosa di simile:

eventForm.errors("name").foreach { error => 
      <div>@Messages(error.message, error.args: _*)</div> 
} 

Per esempio, se fosse error.messageerror.invalid sarebbe mostrare il messaggio precedentemente definito nel file di conf/messagesInvalid value. args definisce alcuni argomenti che il tuo messaggio di errore può gestire. Ad esempio, se gestissi uno error.min, un valore di arg potrebbe essere il valore minimo richiesto. Nel tuo messaggio devi solo seguire lo schema {n}, dove n è l'ordine del tuo argomento.

Naturalmente, siete in grado di definire i propri messaggi del genere:

error.futureBirthday=Are you sure you're born in the future? Oowww hay, we got ourselves a time traveler! 

E nel vostro controller si potrebbe verificare il modulo del genere (una sola riga di codice per mostrare la sensazione di esso)

"year" -> number.verifying("error.furtureBirthday", number <= 2012) // 2012 being the current year 

Se si vuole giocare con le lingue, basta seguire la documentazione.

Cheers, ancora!

+1

Proprio punta, ovviamente per la visualizzazione di un messaggio leggibile dovrebbe essere usato come ''

@Messages(error.message)
invece di ''
@error.message
biesior

+0

Yeap, I18N è un'altra storia – wleao

+0

quindi credo che in realtà bisogno di imparare Scala a utilizzare la riproduzione. wleao, i tuoi esempi hanno funzionato. Ho dovuto usare @Messages (error.message) per ottenere un messaggio leggibile dall'uomo, come diceva Biesior. – Brian

3

Come hai detto tu stesso, message è un membro della FormError, ma si dispone di un Option[FormError]. Si potrebbe utilizzare

eventForm("name").error.map(_.message).getOrElse("") 

Che ti dà il messaggio, se si verifica un errore, e "" se non c'è.

Problemi correlati