我有一个简单且不完整的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中)但我无法从那里看到为什么&#39;何时&#39;字段将无法找到。
这里有什么问题?
如何调试此类问题?
这里是github上整个代码的链接,以防你需要更深入地了解代码:
答案 0 :(得分:0)
我在使用utcTimeFormlet
时遇到了同样的错误,localTimeFormlet
内部调用了localTimeFormlet
,因此很可能是您遇到的错误。
查看localTimeFormlet dFmt tFmt d = LocalTime
<$> "date" .: dateFormlet dFmt (localDay <$> d)
<*> "time" .: timeFormlet tFmt (localTimeOfDay <$> d)
"when"
正如您所看到的,它由两个子公式组成,这就是"date"
不是字段的原因。它指的是"time"
和{{1}}是实际字段的整体结构。
&#34;解决方案&#34;我用的是完全跳过这个功能,因为我实际上只需要一个日期,而不是一个精确的时间。如果你的情况相同,你可能也想这样做。
否则,您必须将两个字段合并到视图中,它应该可以正常工作。
答案 1 :(得分:0)
我解决了它,并对Pseudoradius&#39;进行了修改。溶液
我定义了一个新视图:
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,但可能会这样做,但上面的内容应该足够用于说明目的。