如何使用monadic表单?
问题描述:
我正在实施一个“联系我”表单,它会在提交时发送电子邮件。我需要这个表单来发送自定义的HTML,所以我最终使用了monadic表单。问题是我不知道如何使用单子形式。如何使用monadic表单?
代码如下。为了简洁,我省略了发送电子邮件的部分。问题是我的表单从不验证正确。在我的postContactR
函数中,表单结果永远不会是FormSuccess
。
当我在postContactR
内拨打runFormPost
时,似乎没有正确初始化表格。我总是通过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
答
你是否包括非接触式form.hamlet html的价值?这是一个随机数值。如果你打印r的值(在postContactR中),你会得到更好的调试信息。
我已经在我的写作TODO列表中添加一个monadic窗体示例,它应该很快就会启动。
谢谢。我没有。这是原因。 – akonsu