运行 哪个表格?

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)