Как я могу проверить поле на основе другого поля?

Я пытаюсь получить регистрационную форму с такими полями, как 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"
Другие вопросы по тегам