4

我正在实施一个“联系我”表单,该表单将在提交时发送一封电子邮件。我需要这个表单来发出自定义 HTML,所以我最终使用了 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

4

1 回答 1

3

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

我在我的写作 TODO 列表中添加了一个单子形式的示例,它应该很快就会完成。

于 2011-09-22T02:42:00.253 回答