Проверка, охватывающая несколько полей

Я пытаюсь получить аппликативные формы, и мне было интересно, как реализовать форму, которая проверяет поля, которые зависят от других полей. Например, регистрационная форма, которая имеет 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
    }
Другие вопросы по тегам