Как решить проблему с 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


person Nick Booker    schedule 18.08.2014    source источник


Ответы (2)


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

Взгляните на код localTimeFormlet

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

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

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

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

person Pseudoradius    schedule 22.08.2014
comment
Хммм, я определил поля «дата» и «время» в моем setRecView (каждое как inputText с меткой их соответствующих имен), но теперь получаю HTTP request failed with: date does not exist. Я также пробовал использовать «когда_дата» и «когда_время» в качестве имен полей с эквивалентными результатами. Можете ли вы уточнить, как я должен называть эти два поля в представлении? - person Nick Booker; 29.08.2014

Я решил это с вариацией решения 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 и получить из него дату и время.

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

person Nick Booker    schedule 29.08.2014