Grails: wie die Rückkehr der Fehlermeldung von der controller-Logik (also nicht Ursprung von der domain-Eigenschaft Validierung)?
Fehler z.B. mit schlechten user-Eingabe kann nicht immer vernünftig geprüft mit domain-oder command-Objekt-Validierung.
E. g. beim erstellen eines "Passwort vergessen" - Funktionalität, ich möchte, um eine angemessene Nachricht, wenn der Benutzer einen Benutzernamen ein, die nicht in der Datenbank vorhanden. Also die controller-Aktion, soetwas macht
...
def user = User.find{name==uname}
if(!user) {
//user not found in db, output error and render view again
render view: 'forgotPassword'
return
}
//do reset password stuff
...
Was soll ich tun, um den Fehler anzuzeigen, die in der Ansicht innerhalb der <g:hasErros>
tag?
flash.message
(wie die generierte Controller/Ansichten tun es) scheint nicht Recht zu mir, denn ich bin nicht die bloße Anzeige einer info-Meldung, sondern eine Fehlermeldung. Das ist, warum ich denke, die Nachricht sollte behandelt werden, indem die <g:hasErros>
tag und angezeigt, wie ein domain-validation-Fehler. (Der Benutzer, es ist das gleiche feedback-Ebene: "nicht die Arbeit aufgrund der schlechten input".
Erstellen einer @Validateable
command-Objekt scheint nicht richtig zu sein, auch. IMHO, überprüfen den Wert anhand der Datenbank ist nicht eigentlich die Verantwortung der Validierung innerhalb eines command-Objekt? Oder ist es? Dann scheint es ein wenig zu Komplex für mich.
Also, was ist der beste Weg zu gehen? Andere frameworks (z.B. Wicket) bieten verschiedene Methoden wie error(String msg)
und info(String msg)
die eine einfache Handhabung von feedback-Meldungen in der Ansicht. Gibt es ein ähnliches Konzept in Grails, die ich nur noch nicht gefunden?
- Für diejenigen, die interessiert sind, in die endgültige Lösung, die ich gebaut habe, nach der Eingabe von Burt beckwith und Ian Robers: ich bin leider nicht veröffentlichen darf den Quellcode, aber im Allgemeinen habe ich einfach erstellt eine TagLib mit zwei Mitgliedern: #1 schreiben Sie eine Nachricht hinzufügen, um den flash-Bereich, z.B.
myproject.message(error:'User does not exist')
odermyproject.message(success:'Password changed')
- Alle msg-Befehle Hinzugefügt werden, zwei der vier Listen in
flash
entsprechend Ihrer Art (Fehler/Erfolg/Warnung/info). Mitglied #2 ist der eigentliche tag zum anzeigen von Nachrichten, rendering alle msg-Befehle in die Seite. Es ruft auch flash.Nachricht und bean-Fehler. Hoffe, das hilft
Du musst angemeldet sein, um einen Kommentar abzugeben.
flash
ist nur eine Karte, und Sie können setzen, was Sie wollen, in der es - Zeichenketten, zahlen, Objekte, etc. Es ist sehr praktisch, da es dauert nur eine Anfrage, so ist es nur vorübergehend, belastet die Sitzung. Das übereinkommen in der generierten Aps, ist die Verwendung dermessage
Schlüssel, aber es ist nur eine Konvention.Wenn Sie möchten, speichern Sie eine weitere Nachricht, speichern Sie es in einem anderen Schlüssel:
oder
um ihn in die Aps wie die andere Nachricht.
flash.message
,flash.warning
undflash.error
und dann habe ich einfach<g:flashMessages/>
meiner Ansicht/Gerüst-template/layout.flash
als eine Karte 🙂 Das wäre für das Beispiel, aber was würde das tun, wenn Sie z.B. Ihr benötigt eine Kombination, wie etwa die Möglichkeit zur Ausgabe von zwei Fehlermeldungen von der Steuerung plus mehr von "klassischen" domain-Validierung?<g:haserrors>
zu, könnte dies die beste Lösung für meine... Und ich könnte wahrscheinlich sogar eine Liste der Fehler-msg-Befehle inflash
statt nur einer... Sollte funktionieren.... Ich werde versuchen, diese.