Проверка, охватывающая несколько полей
Я пытаюсь получить аппликативные формы, и мне было интересно, как реализовать форму, которая проверяет поля, которые зависят от других полей. Например, регистрационная форма, которая имеет password
а также confirm_password
поля, и я хотел бы проверить, что password == confirm_password
,
Я мог бы сделать после запуска формы в обработчике, но это означало бы потерю сообщений об ошибках.
Изменить: Забыл упомянуть, я в основном использую аппликативные формы Yesods, но они, кажется, очень близки к пищеварительным функторам
1 ответ
Какой тип системы форм вы используете? Вы можете легко сделать это с digestive-functors
Вот пример одной из моих регистрационных форм:
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"
Здесь вы можете видеть, что я генерирую значение для моего поля "пароль", используя мой passwordConfirmer
поле формы. Это поле использует 2 текстовых поля и помещает их в кортеж, но после проверки оно просто принимает fst
элемент (хотя это может занять snd
Мы гарантировали, что они равны!).
мой Registration
Тип:
data Registration = Registration
{ regUserName :: Text
, regPassword :: Text
}