我正在尝试了解应用程序表单,并且一直想知道如何实现一个表单来验证依赖于其他字段的字段。例如具有password
和confirm_password
字段的注册表单,我想验证它password == confirm_password
。
我可以在表单运行后在处理程序中完成,但这意味着丢失错误消息。
编辑:忘了提,我主要使用 Yesods 应用形式,但它们似乎非常接近消化功能
我正在尝试了解应用程序表单,并且一直想知道如何实现一个表单来验证依赖于其他字段的字段。例如具有password
和confirm_password
字段的注册表单,我想验证它password == confirm_password
。
我可以在表单运行后在处理程序中完成,但这意味着丢失错误消息。
编辑:忘了提,我主要使用 Yesods 应用形式,但它们似乎非常接近消化功能
您使用的是什么类型的表单系统?您可以使用 轻松做到这一点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
}