1

我有一个简单且不完整的 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中)但我可以从那里看不到为什么找不到“何时”字段。

这里有什么问题?

如何调试此类问题?

这是github上整个代码的链接,以防您需要更深入地查看代码:

https://github.com/nmbooker/recremind

4

2 回答 2

0

我通过 Pseudoradius 解决方案的变体解决了它。

我因此定义了一个新视图:

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 进行参数化,并且可能会这样做,但以上对于说明目的来说应该足够了。

于 2014-08-29T19:42:41.097 回答
0

我在使用时遇到了同样的错误utcTimeFormlet,它在内部调用localTimeFormlet,所以很可能这与您遇到的错误相同。

看一下代码localTimeFormlet

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

如您所见,它由两个 subFormlet 组成,这就是为什么"when"不是字段的原因。它指的是具有实际字段的整体"date"构造"time"

我使用的“解决方案”是完全跳过这个功能,因为我实际上只需要一个日期,而不是一个精确的时间。如果在您的情况下也是如此,您可能也想这样做。

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

于 2014-08-22T14:09:46.687 回答