2016-04-14 3 views
2

Я пытаюсь иметь регистрационную форму с такими полями, как email и emailConfirmation, или password и passwordConfirmation. Проверка email и password проста, есть правила, и я написал соответствующие функции.Как я могу проверить поле на основе другого поля?

Остальные два сложнее. Я нашел это question и пытался писать свой код так:

Определение формы, с помощью 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 

и валидатор:

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" 

Но всякий раз, когда я запускаю сервер я получаю сообщение «пароль не поле». Если я удалю валидацию и даю password простую проверку, то она работает как ожидалось. Я что-то упустил?

ответ

1

Я получил помощь в хранилище пищеварительных функций. Thanks cimmanon

Это окончательный код, название поля примечания теперь «password.p1»/«password.p2», а не только пароль/парольConfirmation.

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 } 

валидатор то же самое, за исключением новых имен:

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" 
Смежные вопросы