2012-08-24 19 views
7

Ich versuche, Anwendungsformen zu grok, und ich habe mich gefragt, wie man ein Formular implementiert, das Felder validiert, die von anderen Feldern abhängen. Zum Beispiel ein Registrierungsformular, das password und confirm_password Felder hat, und ich möchte das password == confirm_password validieren.Validierung überspannend mehrere Felder

Ich könnte getan werden, nachdem das Formular im Handler ausgeführt wurde, aber das würde bedeuten, Fehlermeldungen zu verlieren.

Edit: vergessen zu erwähnen, ich bin in erster Linie Yesods applicative Formen verwenden, aber sie scheinen ganz in der Nähe des Verdauungs-functors

Antwort

7

Welche Art von Formular-System zu sein, verwenden Sie? Sie können dies leicht tun mit digestive-functors, hier ist ein Beispiel für eine meiner Anmeldeformular:

registrationForm = 
    Registration 
     <$> "username" .: text Nothing 
     <*> "password" .: passwordConfirmer 
    where passwordConfirmer = 
      validate fst' $ (,) <$> ("p1" .: text Nothing) 
           <*> ("p2" .: text Nothing) 
     fst' (p1, p2) | p1 == p2 = Success p1 
         | otherwise = Error "Passwords must match" 

Hier können Sie sehen, ich einen Wert für mein ‚Passwort‘ Feld unter Verwendung meines passwordConfirmer Formularfeld erzeugen. Dieses Feld verwendet 2 Textfelder und fügt sie in ein Tupel ein, aber nach der Validierung benötigt es nur das Element (obwohl es snd dauern könnte, wir haben garantiert, dass sie gleich sind!).

Mein Registration Typ ist:

data Registration = Registration 
    { regUserName :: Text 
    , regPassword :: Text 
    } 
+0

I yesods applicative Formen bin mit, aber das ist eine gute Antwort zu – Masse