Как я могу проверить поле на основе другого поля?
Я пытаюсь получить регистрационную форму с такими полями, как email
а также emailConfirmation
, или же password
а также passwordConfirmation
, Пользователи email
а также password
Это просто, есть правила, и я написал соответствующие функции.
Другие два сложнее, хотя. Я нашел этот вопрос и попытался написать свой код так:
Определение формы с использованием 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 ответ
Я получил помощь в хранилище пищеварительных функторов. Спасибо Цимманон
Это окончательный код, имя поля примечания теперь "password.p1"/"password.p2", а не просто 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 }
валидатор такой же, за исключением новых имен:
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"