Haskell “我该如何解决?”;HTTP请求失败,错误为:when不是字段";消化函子代码中的运行时错误?
我有一个简单且不完整的Happstack应用程序,它由一个定义如下的消化函子表单组成:Haskell “我该如何解决?”;HTTP请求失败,错误为:when不是字段";消化函子代码中的运行时错误?,haskell,happstack,digestive-functors,Haskell,Happstack,Digestive Functors,我有一个简单且不完整的Happstack应用程序,它由一个定义如下的消化函子表单组成: setRecFormSpec :: Monad m => Form Text m Reminder setRecFormSpec = Reminder <$> "progname" .: string Nothing <*> "channel" .: string Nothing <*> "when" .: localTimeFormlet "
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)
提醒的定义如下:
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
我已经找到了错误消息的定义(在中),但我无法从中看出为什么找不到“何时”字段
这里有什么问题
如何调试此类问题
这里有一个指向github上全部代码的链接,以防您需要更深入地查看代码:
我在使用
utcTimeFormlet
时遇到了相同的错误,它在内部调用localTimeFormlet
,因此这可能与您遇到的错误相同
查看localTimeFormlet
localTimeFormlet dFmt tFmt d = LocalTime
<$> "date" .: dateFormlet dFmt (localDay <$> d)
<*> "time" .: timeFormlet tFmt (localTimeOfDay <$> d)
localTimeFormlet dFmt tFmt d=LocalTime
“日期”。:dateFormlet dFmt(localDay d)
“时间”。:timeFormlet tFmt(localTimeOfDay d)
正如您所看到的,它由两个子表单组成,这就是为什么当“不是一个字段时,”。它指的是整体结构,“日期”
和“时间”
为实际字段
我使用的“解决方案”是完全跳过这个函数,因为我实际上只需要一个日期,而不需要精确的时间。如果你的情况也是这样,你可能也想这样做
否则,您将不得不将这两个字段合并到视图中,它应该可以工作。我用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
在我的表格中,我将其与子视图一起使用,因此:
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,而且可能会,但以上内容足以说明问题。Hmmm我已经在我的setRecView中定义了一个“日期”和“时间”字段(每个都是带有各自相同名称标签的inputText)但是现在getHTTP请求失败,原因是:日期不存在
。我也尝试了“when_date”和“when_time”作为字段名,结果是相同的。你能澄清一下我应该在视图中称这两个字段为什么吗?