2012-08-24 50 views
7

我正在尝试groh应用程序的形式,我一直想知道如何实现一个窗体验证依赖于其他字段的字段。例如一个登记表,其中passwordconfirm_password字段,我想验证password == confirm_password验证跨越多个字段

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

编辑:忘了提,我主要是利用Yesods合用的形式,但他们似乎是相当接近的消化,仿函数

您正在使用什么类型的表单系统

回答

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 
    } 
+0

我使用yesods合用的形式,但这是很好的答案太 – Masse