如何从参数不可用的处理程序处理参数化的Yesod表单?

时间:2016-07-06 20:42:44

标签: haskell yesod

我有以下表格:

userForm :: UserId -> Form UserDemographics
userForm uid = renderDivs $ UserDemographics <$>
  pure uid <*>
  areq yearField "Year of birth" Nothing <*>
  areq textField "Gender" Nothing <*>
  areq countryField "Country of residence" Nothing <*>
  areq boolField "Are you a computer programmer?" Nothing

在我的主页上,我使用generateFormPost $ userForm (entityKey userEnt)制作填充了UserId的表单。但我想用AJAX处理输入,因此单独的Handler获取结果表格。另一个处理程序无权访问UserId。我该如何处理表格?我试过这个,这引发了一个错误:

postDemoFormR :: Handler RepJson
postDemoFormR = do
  ((formData, _), _) <- runFormPost $ userForm undefined
  $(logDebug) $ pack $ show formData
  return $ repJson ()

我可以更改userForm的类型以接受Maybe UserId而不仅仅是UserId,或者为UserId的调用构成虚假runFormPost这些都是黑客攻击。有一种简单,干净的方法吗?

1 个答案:

答案 0 :(得分:1)

您可以使用hiddenField,但几乎可以肯定您真正想要的内容(任何用户只需提交就可以欺骗UserId一个不同的价值)。假设您尝试做的事实上是说&#34;谁是当前用户&#34;,您需要某种方式在您的AJAX处理程序中安全地确定(例如requireAuthId )。