2012-04-26 9 views
10

Capisco come aggiungere semplici convalide di form in Play 2 come nonEmptyText, ma come implementare convalide più complesse come "almeno uno dei campi deve essere definito"? Attualmente lancio un'eccezione nel mio oggetto modello se viene inizializzato con tutti gli None s, ma questo genera un messaggio di errore sgradevole. Preferirei ricevere un messaggio di errore amichevole nella pagina del modulo.Come specificare convalide di moduli complessi in Play 2?

+0

è questa domanda applicabile for Gioca v1 o Play v2 !? – adis

risposta

9

È possibile nidificare il mappings/tuples nella definizione modulo e aggiungere verifying norme in materia di mappatura, sub-mapping, tuple e sub-tuple. Quindi nei modelli è possibile recuperare gli errori utilizzando form.errors("fieldname") per un campo specifico o un gruppo di campi.

Ad esempio:

val signinForm: Form[Account] = Form(
    mapping(
     "name" -> text(minLength=6, maxLength=50), 
     "email" -> email, 
     "password" -> tuple(
      "main" -> text(minLength=8, maxLength=16), 
      "confirm" -> text 
     ).verifying(
      // Add an additional constraint: both passwords must match 
      "Passwords don't match", password => password._1 == password._2 
     ) 
    )(Account.apply)(Account.unapply) 
) 

Se si dispone di due diverse password, è possibile recuperare l'errore nel modello utilizzando form.errors("password")

In questo esempio, si dovrà scrivere il proprio Account.apply e Account.unapply per gestire (String, String, (String, String))

+1

Cool ma sfortunatamente questo significa anche che Account non può essere una case case. Non penso che le case history possano ridefinire inapplicabile. – schmmd

+0

@schmmd infatti Account.apply è un metodo dell'oggetto companion della classe case -> http://daily-scala.blogspot.fr/2009/09/companion-object.html. Puoi scrivere il tuo. – iwalktheline

+0

Certo, ma il mio problema è 'unapply' non' apply'. – schmmd

0

In gioco! Framework, puoi mostrare i messaggi di errore amichevoli usando la variabile flash. Hai solo bisogno di scrivere qualcosa del genere;

flash.error("Oops. An error occurred"); 

al controller. Ad esempio, dove questo messaggio di errore risiederà nella pagina html dovrebbe essere impostato;

<h1>${flash.error}</h1> 

Play! Framework metterà il messaggio di errore dove trova questa cosa $ {flash.error}.

7

Ho migliorato la risposta accettata di @ kheraud. Puoi prendere la tupla e trasformarla in una singola stringa. Ciò consente di utilizzare le funzioni di applicazione/non valida predefinite.

Esempio:

val signinForm: Form[Account] = Form(
    mapping(
     "name" -> text(minLength=6, maxLength=50), 
     "email" -> email, 
     "password" -> tuple(
      "main" -> text(minLength=8, maxLength=16), 
      "confirm" -> text 
     ).verifying(
      // Add an additional constraint: both passwords must match 
      "Passwords don't match", password => password._1 == password._2 
     ).transform(
      { case (main, confirm) => main }, 
      (main: String) => ("", "") 
     ) 
    )(Account.apply)(Account.unapply) 
) 
+0

+1 per la trasformazione - non l'ho visto fino ad ora - potrebbe essere una cosa molto utile da avere per tutti quei casi limite che inevitabilmente saltano fuori. Grazie! – Techmag

+0

Questo è perfetto in quanto non è necessario cambiare la classe del caso. – haffla

Problemi correlati