2016-04-14 7 views
2

Ich versuche, ein Registrierungsformular mit Feldern wie email und emailConfirmation oder password und passwordConfirmation zu haben. Validieren email und password ist einfach, es gibt Regeln und ich habe die entsprechenden Funktionen geschrieben.Wie kann ich ein Feld basierend auf einem anderen Feld validieren?

Die anderen beiden sind jedoch schwieriger. Ich fand dieses question und versuchte, meinen Code wie folgt schreiben:

Die Formulardefinition mit Blaze:

registrationForm :: (View Html) -> Html 
registrationForm view = docTypeHtml $ do 
    form ! name "registration" ! method "post" ! action "/register" $ do 
    fieldset $ do 
     label ! for "password" $ (text "Password") 
     inputText "password" view 
     errorList "password" view 

     br 

     label ! for "passwordConfirmation" $ (text "Password Confirmation") 
     inputText "passwordConfirmation" view 
     errorList "passwordConfirmation" view 

und der Validator:

data Password = Password { password :: Text } 

validateForm :: Monad m => Form Html m Password 
validateForm = 
    Password 
    <$> "password" .: validatePassword 
    where 
    validatePassword = 
     validate fst' $ (,) <$> ("password"    .: D.text Nothing) 
          <*> ("passwordConfirmation" .: D.text Nothing) 
    fst' (p1, p2) | p1 == p2 = Success p1 
        | otherwise = Error "Passwords must match" 

Aber immer, wenn ich den Server laufen bekomme ich ein Nachricht sagt "Passwort ist kein Feld". Wenn ich die Validierung entferne und password eine einfache Validierung gebe, dann funktioniert es wie erwartet. Fehle ich hier etwas?

Antwort

1

Ich bekam Hilfe auf der Verdauungs-Funktoren-Repository. Thanks cimmanon

Dies ist der letzte Code, der Name des Notizfelds lautet jetzt "password.p1"/"password.p2" anstatt nur password/passwordConfirmation.

registrationForm :: (View Html) -> Html 
registrationForm view = docTypeHtml $ do 
    form ! name "registration" ! method "post" ! action "/register" $ do 
    fieldset $ do 
     inputText "password.p1" view 
     br 
     inputText "password.p2" view 
     errorList "password" view 
data Password = Password { password :: Text } 

Validator ist das gleiche, mit Ausnahme von neuen Namen:

validateForm :: Monad m => Form Html m Password 
validateForm = 
    Password 
    <$> "password" .: validatePassword 
    where 
    validatePassword = 
     validate fst' $ (,) <$> ("p1" .: D.text Nothing) 
          <*> ("p2" .: D.text Nothing) 
    fst' (p1, p2) | p1 == p2 = Success p1 
        | otherwise = Error "Passwords must match" 
Verwandte Themen