Как устранить ошибку "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, на случай, если вам нужно более подробно изучить код:
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"
быть фактическими полями.
"Решение", которое я использовал, состояло в том, чтобы полностью пропустить эту функцию, так как на самом деле мне нужна была только дата, а не точное время. Если то же самое в вашем случае, вы, вероятно, тоже хотите это сделать.
В противном случае вам придется включить эти два поля в ваше представление, и оно должно работать.