Haskell 运行哪个表单?

Haskell 运行哪个表单?,haskell,yesod,Haskell,Yesod,我正在尝试在一个页面上构建一个包含多个类似表单的页面。每个表单都非常简单,它提供了一个整数输入和一个提交按钮。每个表单对应一个计数器,提交表单时计数器应该增加 incrementCounterForm :: Entity Counter -> Form (CounterId, Int) incrementCounterForm (Entity i _) = renderBoostrap3 BootstrapInlineForm

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

incrementCounterForm :: Entity Counter -> Form (CounterId, Int)
incrementCounterForm (Entity i _) = renderBoostrap3 BootstrapInlineForm
                                      $ (,) 
                                        <$> pure i 
                                        <*> areq intField "value" Nothing
incrementCounterForm::Entity Counter->Form(CounterId,Int)
增量反格式(实体i)=RenderBostRap3引导行格式
$ (,) 
纯i
areq intField“值”为零
在我的GET handler中,我是这样做的

counters <- runDB $ selectList [] [] -- Get all the current counters
forms <- mapM (generateFormPost . incrementCounterForm) counters -- Generate the forms

counters因此,我可能建议您将计数器ID移动到URL中,这样您就可以执行类似于发布到/counters/1/increment之类的操作。将ID置于隐藏字段中会让人感觉有点不舒服

但是,如果您确实希望将其保存在隐藏字段中,则可以让表单将
Maybe(实体计数器)
作为参数。您要做的是,当用户获得页面并生成表单时,您将传入一个
(仅实体)
,作为用于填充隐藏字段的参数。当用户向您发帖并运行表单时,您将不提供默认值(因为您需要存储在隐藏字段中的值)

下面是一个这样的例子:

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)
data MyForm=MyForm
{增量::整数
,counterId::counterId
}
衍生节目
myForm::Maybe(实体计数器)->表单处理程序myForm
myForm maybeEntity=myForm
areq intField“增加多少?”没有
areq hiddenField“”(entityKey可能是Entity)
生成表单时,为隐藏字段提供一个值:

(widget, enctype) <- generateFormPost $ renderBootstrap (myForm (Just someEntity))

(widget,enctype)我是否误以为
pure
将嵌入一个隐藏的输入字段?事实上,如果我提供一个任意的
实体计数器
字段,将其从
pure
更改为
areq hiddenField”“(仅限I)
,它就可以工作。对于未定义的仍然不起作用。可以采取的一种方法是将计数器ID移动到URL中。我不确定您当前的URL结构是什么样的,但是如果您可以发布到/counters/1/increment或其他什么,您就不需要将计数器ID存储在隐藏字段中。我已经想到了这一点,这就是我目前正在做的。我只是认为这种方法也应该有效,并且想知道为什么它不起作用。我希望Haskell的懒惰可以让我在读取表单时使用
未定义的
。酷,我可能会避免
未定义的
。对于如何处理隐藏字段,我刚刚发布了一个适合您的答案。
(widget, enctype) <- generateFormPost $ renderBootstrap (myForm (Just someEntity))
((res, widget), enctype) <- runFormPost $ renderBootstrap (myForm Nothing)