如何使用monadic形式?

时间:2011-09-21 23:28:51

标签: haskell yesod

我正在实施一个“与我联系”表单,该表单将在提交时发送电子邮件。我需要这个表单来发出自定义HTML,所以我最终使用了monadic表单。问题是我不知道如何使用monadic形式。

代码如下。为简洁起见,我省略了发送电子邮件的部分。问题是我的表单永远不会正确验证。表单结果在我的FormSuccess函数中永远不会postContactR

当我在runFormPost内拨打postContactR时似乎没有正确初始化表单。我总是将Nothing而不是实际ContactData传递给contactForm,我不知道如何根据请求构建我的ContactData。我对问题的理解是否正确?我正在尝试使用记录不完整的功能。 :)

任何帮助?

编辑:看起来很奇怪的是,如果我提交的表单无效,验证错误会在表单中显示,因此请求数据会在某个时刻被读取。什么行不通的是,当没有错误时,我不会被重定向到RootR

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
module Handler.Contact where
import Control.Applicative ((<$>), (<*>)) import Data.Text (Text) import Foundation import Network.Mail.Mime
data ContactData = ContactData { contactName :: Text , contactEmail :: Text , contactMessage :: Textarea } deriving Show
contactForm d = \html -> do (r1, v1) <- mreq textField "Your name:" (contactName <$> d) (r2, v2) <- mreq emailField "Your e-mail:" (contactEmail <$> d) (r3, v3) <- mreq textareaField "Message:" (contactMessage <$> d) let views = [v1, v2, v3] return (ContactData <$> r1 <*> r2 <*> r3, $(widgetFile "contact-form"))
getContactR :: Handler RepHtml getContactR = do ((_, form), _) <- runFormPost (contactForm Nothing) defaultLayout $ do setTitle "contact" addWidget $(widgetFile "contact")
postContactR :: Handler RepHtml postContactR = do ((r, form), _) <- runFormPost (contactForm Nothing) case r of FormSuccess d -> do sendEmail d setMessage "Message sent" redirect RedirectTemporary RootR _ -> getContactR

1 个答案:

答案 0 :(得分:3)

你是否在contact-form.hamlet中包含了html值?这是一个nonce值。如果打印r的值(在postContactR中),您将获得更好的调试信息。

我在写TODO列表时添加了一个monadic表单示例,它应该很快就会出现。