我如何通过以下方式解决" HTTP请求失败:何时不是字段"消化函数代码中的运行时错误?

时间:2014-08-18 16:37:11

标签: haskell happstack digestive-functors

我有一个简单且不完整的Happstack应用程序,它由消化函数形式组成,定义如下:

setRecFormSpec :: Monad m => Form Text m Reminder
setRecFormSpec = Reminder
    <$> "progname" .: string Nothing
    <*> "channel" .: string Nothing
    <*> "when" .: localTimeFormlet "%d/%m/%Y" "%H:%M" Nothing
    <*> "recordLimit" .: stringRead "Can't parse number" (Just 7)

及其观点定义如下:

setRecView :: View H.Html -> H.Html
setRecView view = do
        H.div ! A.class_ "container" $ do
            H.h1 "Set Record Reminder"
            childErrorList "" view

            divFormGroup $ do
                label "progname" view "Program Name:"
                formControl $ inputText "progname" view

            divFormGroup $ do
                label "channel" view "Channel:"
                formControl $ inputText "channel" view

            divFormGroup $ do
                label "when" view "When:"
                formControl $ inputDate "when" view

            divFormGroup $ do
                label "recordLimit" view "Recording Limit (days):"
                formControl $ inputText "recordLimit" view

            divFormGroup $ do
                formControl $ inputSubmit "Signup"

-- divFormGroup -- candidate to go into a Bootstrap library
divFormGroup :: H.Html -> H.Html
divFormGroup h =
    H.div ! A.class_ "form-group" $ h

-- formControl -- candidate to go into a Bootstrap library
formControl :: H.Html -> H.Html
formControl h = (h ! A.class_ "form-control")

提醒定义如下:

data Reminder = Reminder {
        programName     :: String    -- ^ name of program
    ,   channel         :: String    -- ^ name of broadcast channel
    ,   firstShowing    :: LocalTime  -- ^ time of first showing
    ,   timerPeriodDays :: Integer     -- ^ how far in advance we can set timer, in days
} deriving (Show)

当我浏览到表单的路径(/ setrec)时,我得到一个空白页面,控制台上印有以下错误消息:

HTTP request failed with: when is not a field

我已经找到了定义该错误消息的位置(在https://github.com/jaspervdj/digestive-functors/blob/7e50d5686abc4b39389ed195693660d758987c7c/digestive-functors/src/Text/Digestive/Form/Internal.hs中)但我无法从那里看到为什么&#39;何时&#39;字段将无法找到。

这里有什么问题?

如何调试此类问题?

这里是github上整个代码的链接,以防你需要更深入地了解代码:

https://github.com/nmbooker/recremind

2 个答案:

答案 0 :(得分:0)

我在使用utcTimeFormlet时遇到了同样的错误,localTimeFormlet内部调用了localTimeFormlet,因此很可能是您遇到的错误。

查看localTimeFormlet dFmt tFmt d = LocalTime <$> "date" .: dateFormlet dFmt (localDay <$> d) <*> "time" .: timeFormlet tFmt (localTimeOfDay <$> d)

的代码
"when"

正如您所看到的,它由两个子公式组成,这就是"date"不是字段的原因。它指的是"time"和{{1}}是实际字段的整体结构。

&#34;解决方案&#34;我用的是完全跳过这个功能,因为我实际上只需要一个日期,而不是一个精确的时间。如果你的情况相同,你可能也想这样做。

否则,您必须将两个字段合并到视图中,它应该可以正常工作。

答案 1 :(得分:0)

我解决了它,并对Pseudoradius&#39;进行了修改。溶液

我定义了一个新视图:

dateTimeView view = do
    divFormGroup $ do
        label "date" view "When (Date):"
        formControl $ inputText "date" view

    divFormGroup $ do
        label "time" view "When (Time):"
        formControl $ inputText "time" view

并以我的形式将其与subView一起使用,因此:

setRecView :: View H.Html -> H.Html
setRecView view = do
        H.div ! A.class_ "container" $ do
            -- ...

            divFormGroup $ do
                label "channel" view "Channel:"
                formControl $ inputText "channel" view

            dateTimeView $ subView "when" view

            divFormGroup $ do
                label "recordLimit" view "Recording Limit (days):"
                formControl $ inputText "recordLimit" view

            divFormGroup $ do
                formControl $ inputSubmit "Signup"

然后runForm来电可以找到when字段,并从中获取日期和时间。

我可以使用dateLabelText和timeLabelText参数化dateTimeView,但可能会这样做,但上面的内容应该足够用于说明目的。