Как устранить ошибку "HTTP-запрос завершен с ошибкой: когда нет поля" в коде пищеварительных функторов?

У меня есть простое и неполное приложение 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

2 ответа

Решение

Я решил это, с вариацией решения Псевдорадиуса.

Я определил новый взгляд таким образом:

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 поле и получить дату и время от него.

Я мог бы параметризировать dateTimeView с помощью dateLabelText и timeLabelText, и, вероятно, так будет, но приведенного выше должно быть достаточно для иллюстративных целей.

Я столкнулся с той же ошибкой, когда я использовал utcTimeFormlet, который внутренне называет localTimeFormlet так что вполне вероятно, что это та же самая ошибка, с которой вы столкнулись.

Посмотрите на код localTimeFormlet

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

Как вы можете видеть, он состоит из двух подформлетов, поэтому "when" это не поле. Это относится к общей конструкции с "date" а также "time" быть фактическими полями.

"Решение", которое я использовал, состояло в том, чтобы полностью пропустить эту функцию, так как на самом деле мне нужна была только дата, а не точное время. Если то же самое в вашем случае, вы, вероятно, тоже хотите это сделать.

В противном случае вам придется включить эти два поля в ваше представление, и оно должно работать.

Другие вопросы по тегам