我正在尝试使用适用的表单,我一直在想如何实现一个验证依赖于其他字段的字段的表单。例如,注册表单包含password
和confirm_password
字段,我想验证password == confirm_password
。
我可以在表单运行后在处理程序中完成,但这意味着丢失错误消息。
编辑:忘记提及,我主要使用Yesods的应用形式,但它们似乎与消化函数非常接近
答案 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
}