2012-08-24 27 views
7

Sto cercando di compilare moduli applicativi e mi sono chiesto come implementare un modulo che convalida i campi che dipendono da altri campi. Ad esempio un modulo di registrazione che ha campi password e confirm_password e vorrei verificare che password == confirm_password.Convalida su più campi

Avrei potuto fare dopo che il modulo è stato eseguito, nel gestore, ma ciò significherebbe perdere i messaggi di errore.

Edit: dimenticato di dire, sto utilizzando prevalentemente Yesods forme applicative, ma sembrano essere abbastanza vicino al digestivi-funtori

risposta

7

Che tipo di sistema di modulo stai usando? Si può facilmente farlo con digestive-functors, ecco un esempio di uno dei miei moduli di registrazione:

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" 

Qui potete vedere ho generare un valore per il mio campo 'password' usando il mio campo passwordConfirmer modulo. Questo campo utilizza 2 campi di testo e li inserisce in una tupla, ma dopo la convalida prende solo l'elemento fst (anche se potrebbe richiedere snd, abbiamo garantito che sono uguali!).

mio tipo Registration è:

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

sto usando yesods forme applicative, ma questo è troppo buona risposta – Masse

Problemi correlati