验证跨越多个字段

Mas*_*sse 7 haskell yesod digestive-functors

我正在尝试使用应用程序表单,我一直在想如何实现一个验证依赖于其他字段的字段的表单.例如,注册表单有passwordconfirm_password字段,我想验证password == confirm_password.

我可以在表单运行后在处理程序中完成,但这意味着丢失错误消息.

编辑:忘了提,我主要使用Yesods的应用形式,但它们似乎非常接近消化函数

och*_*les 7

你使用什么类型的表单系统?您可以轻松地执行此操作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"
Run Code Online (Sandbox Code Playgroud)

在这里,您可以看到我使用passwordConfirmer表单字段为我的"密码"字段生成了一个值.该字段使用2个文本字段并将它们放入元组中,但在验证之后它只需要fst元素(尽管它可以采用snd,但我们保证它们是相等的!).

我的Registration类型是:

data Registration = Registration
    { regUserName :: Text
    , regPassword :: Text
    }
Run Code Online (Sandbox Code Playgroud)