验证跨越多个字段

时间:2012-08-24 09:47:47

标签: haskell yesod digestive-functors

我正在尝试使用适用的表单,我一直在想如何实现一个验证依赖于其他字段的字段的表单。例如,注册表单包含passwordconfirm_password字段,我想验证password == confirm_password

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

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

1 个答案:

答案 0 :(得分: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"

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

我的Registration类型为:

data Registration = Registration
    { regUserName :: Text
    , regPassword :: Text
    }