10 Stimmen

Wie kann man komplexe Formularvalidierungen in Play 2 festlegen?

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.

0 Stimmen

Ist diese Frage für Play v1 oder Play v2 anwendbar?

9voto

kheraud Punkte 4880

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

7voto

Chris Dail Punkte 24971

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)
)

0voto

Alpay Punkte 1342

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X