2011-09-21 66 views
4

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

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

当我在postContactR内拨打runFormPost时,似乎没有正确初始化表格。我总是通过Nothing而不是实际的ContactDatacontactForm,我不知道如何从请求中构建我的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

回答

3

你是否包括非接触式form.hamlet html的价值?这是一个随机数值。如果你打印r的值(在postContactR中),你会得到更好的调试信息。

我已经在我的写作TODO列表中添加一个monadic窗体示例,它应该很快就会启动。

+0

谢谢。我没有。这是原因。 – akonsu