哪种形式运行?

时间:2015-01-28 02:59:24

标签: haskell yesod

我试图在一个页面上构建一个包含多个相似表单的页面。每个表单都非常简单,它提供了一个整数输入和一个提交按钮。每个表单对应一个计数器,并且在提交表单时应该增加计数器。

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似乎在评估它。

1 个答案:

答案 0 :(得分:0)

所以,我可能会建议您将您的计数器ID移到URL中,这样您就可以执行POST / to / / / / 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)