我正在实施一个“与我联系”表单,该表单将在提交时发送电子邮件。我需要这个表单来发出自定义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
答案 0 :(得分:3)
你是否在contact-form.hamlet中包含了html值?这是一个nonce值。如果打印r的值(在postContactR中),您将获得更好的调试信息。
我在写TODO列表时添加了一个monadic表单示例,它应该很快就会出现。