运行 哪个表格?
Which form to run?
我正在尝试在一个页面上构建一个包含多个相似表单的页面。每个表单都非常简单,它提供了一个整数输入和一个提交按钮。每个表单对应一个计数器,提交表单时应该增加计数器。
incrementCounterForm :: Entity Counter -> Form (CounterId, Int)
incrementCounterForm (Entity i _) = renderBoostrap3 BootstrapInlineForm
$ (,)
<$> pure i
<*> areq intField "value" Nothing
在我的 GET 处理程序中我这样做
counters <- runDB $ selectList [] [] -- Get all the current counters
forms <- mapM (generateFormPost . incrementCounterForm) counters -- Generate the forms
然后在我的 hamlet 文件中,我遍历表单并单独呈现它们(它们都转到同一个处理程序)。
我的问题与 POST 处理程序有关。我该怎么做 runFormPost?
((result,_),_) <- runFormPost $ incrementCounterForm undefined
这里 undefined
应该是什么?我想从表格中获取计数器,而不必提供计数器。
编辑:我谎称提供了一个任意计数器工作
如果我确实提供了一个任意的 Entity Counter
它似乎可以工作(结果中没有使用提供的计数器)。但是,我不能将其保留为 undefined
,因为 runFormPost 似乎对其进行了评估。
所以,我可能会建议将您的计数器 ID 移到 URL,这样您就可以执行诸如发布到 /counters/1/increment 之类的操作。将 ID 放在隐藏字段中感觉有点不对劲。
但是,如果您确实想将它保留在隐藏字段中,您可以让表单以 Maybe (Entity Counter)
作为参数。你要做的是当用户获取页面并且你正在生成表单时,你将传入一个 (Just entity)
作为你将用来填充隐藏字段的参数。当用户向您发送 POST 并且您 运行 表单时,您将不提供默认值(因为您需要存储在隐藏字段中的值)。
这是一个示例:
data MyForm = MyForm
{ increment :: Integer
, counterId :: CounterId
}
deriving Show
myForm :: Maybe (Entity Counter) -> AForm Handler MyForm
myForm maybeEntity = MyForm
<$> areq intField "How much to increment?" Nothing
<*> areq hiddenField "" (entityKey <$> maybeEntity)
生成表单时,为隐藏字段提供一个值:
(widget, enctype) <- generateFormPost $ renderBootstrap (myForm (Just someEntity))
当运行设置表单时,不提供默认值;隐藏字段应该已经有数据:
((res, widget), enctype) <- runFormPost $ renderBootstrap (myForm Nothing)
我正在尝试在一个页面上构建一个包含多个相似表单的页面。每个表单都非常简单,它提供了一个整数输入和一个提交按钮。每个表单对应一个计数器,提交表单时应该增加计数器。
incrementCounterForm :: Entity Counter -> Form (CounterId, Int)
incrementCounterForm (Entity i _) = renderBoostrap3 BootstrapInlineForm
$ (,)
<$> pure i
<*> areq intField "value" Nothing
在我的 GET 处理程序中我这样做
counters <- runDB $ selectList [] [] -- Get all the current counters
forms <- mapM (generateFormPost . incrementCounterForm) counters -- Generate the forms
然后在我的 hamlet 文件中,我遍历表单并单独呈现它们(它们都转到同一个处理程序)。
我的问题与 POST 处理程序有关。我该怎么做 runFormPost?
((result,_),_) <- runFormPost $ incrementCounterForm undefined
这里 undefined
应该是什么?我想从表格中获取计数器,而不必提供计数器。
编辑:我谎称提供了一个任意计数器工作
如果我确实提供了一个任意的 Entity Counter
它似乎可以工作(结果中没有使用提供的计数器)。但是,我不能将其保留为 undefined
,因为 runFormPost 似乎对其进行了评估。
所以,我可能会建议将您的计数器 ID 移到 URL,这样您就可以执行诸如发布到 /counters/1/increment 之类的操作。将 ID 放在隐藏字段中感觉有点不对劲。
但是,如果您确实想将它保留在隐藏字段中,您可以让表单以 Maybe (Entity Counter)
作为参数。你要做的是当用户获取页面并且你正在生成表单时,你将传入一个 (Just entity)
作为你将用来填充隐藏字段的参数。当用户向您发送 POST 并且您 运行 表单时,您将不提供默认值(因为您需要存储在隐藏字段中的值)。
这是一个示例:
data MyForm = MyForm
{ increment :: Integer
, counterId :: CounterId
}
deriving Show
myForm :: Maybe (Entity Counter) -> AForm Handler MyForm
myForm maybeEntity = MyForm
<$> areq intField "How much to increment?" Nothing
<*> areq hiddenField "" (entityKey <$> maybeEntity)
生成表单时,为隐藏字段提供一个值:
(widget, enctype) <- generateFormPost $ renderBootstrap (myForm (Just someEntity))
当运行设置表单时,不提供默认值;隐藏字段应该已经有数据:
((res, widget), enctype) <- runFormPost $ renderBootstrap (myForm Nothing)