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