[英]How do I solve “HTTP request failed with: when is not a field” runtime errors in digestive-functors code?
我有一个简单且不完整的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上整个代码的链接,以防您需要更深入地研究代码:
我在使用utcTimeFormlet
时遇到了相同的错误,该内部调用了localTimeFormlet
因此很可能是您遇到的相同错误。
看一下localTimeFormlet
的代码
localTimeFormlet dFmt tFmt d = LocalTime
<$> "date" .: dateFormlet dFmt (localDay <$> d)
<*> "time" .: timeFormlet tFmt (localTimeOfDay <$> d)
如您所见,它由两个subFormlet组成,这就是"when"
不是字段的原因。 它指的是带有"date"
和"time"
作为实际字段的整体结构。
我使用的“解决方案”是完全跳过此功能,因为我实际上只需要一个日期,而不是精确的时间。 如果您的情况相同,那么您可能也想这样做。
否则,您将不得不将这两个字段合并到您的视图中,并且它应该起作用。
我解决了这个问题,对伪半径的解决方案做了一些改动。
我因此定义了一个新视图:
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
一起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,也许可以,但是以上内容足以说明问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.