Ich verstehe, wie ich einfache Formularvalidierungen in Play 2 hinzufügen kann, wie z.B. nonEmptyText
, aber wie könnte ich komplexere Validierungen implementieren, wie z.B. "mindestens eines der Felder muss definiert sein"? Aktuell werfe ich eine Ausnahme in meinem Modellobjekt, wenn es mit ausschließlich None
-Werten initialisiert wird, aber das erzeugt eine unangenehme Fehlermeldung. Ich würde es bevorzugen, eine freundliche Fehlermeldung auf der Formularseite zu erhalten.
Antworten
Zu viele Anzeigen?Sie können die mappings
/tuples
in Ihrer Form-Definition verschachteln und Überprüfungsregeln für Mapping, Sub-Mapping, Tuple und Sub-Tuple hinzufügen. Dann können Sie in Ihren Vorlagen die Fehler mit form.errors("fieldname")
für ein bestimmtes Feld oder eine Gruppe von Feldern abrufen.
Zum Beispiel :
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(
// Fügen Sie eine zusätzliche Einschränkung hinzu: beide Passwörter müssen übereinstimmen
"Passwörter stimmen nicht überein", password => password._1 == password._2
)
)(Account.apply)(Account.unapply)
)
Wenn Sie zwei verschiedene Passwörter haben, können Sie den Fehler in Ihrer Vorlage mit form.errors("password")
abrufen.
In diesem Beispiel müssen Sie Ihre eigene Account.apply
und Account.unapply
schreiben, um (String, String, (String, String))
zu verarbeiten
Ich habe @kherauds akzeptierte Antwort verbessert. Du kannst das Tuple nehmen und es zurück in einen einzigen String umwandeln. Dies ermöglicht es dir, die Standard apply/unapply Funktionen zu verwenden.
Beispiel :
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(
// Füge eine zusätzliche Einschränkung hinzu: beide Passwörter müssen übereinstimmen
"Passwörter stimmen nicht überein", password => password._1 == password._2
).transform(
{ case (main, confirm) => main },
(main: String) => ("", "")
)
)(Account.apply)(Account.unapply)
)
In Play! Framework können Sie freundliche Fehlermeldungen anzeigen, indem Sie die Flash-Variable verwenden. Sie müssen nur etwas wie Folgendes schreiben;
flash.error("Ups. Ein Fehler ist aufgetreten");
zu Ihrem Controller. Wo diese Fehlermeldung auf der HTML-Seite erscheinen soll, sollte zum Beispiel mit;
${flash.error}
festgelegt werden. Play! Framework platziert die Fehlermeldung dort, wo es dieses ${flash.error} findet.
0 Stimmen
Ist diese Frage für Play v1 oder Play v2 anwendbar?