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)