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

How do I process a parameterized Yesod form from a handler where the parameter is unavailable?

我有以下表格:

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 处理输入,所以单独的 [=14] =] 获取表单的结果。另一个处理程序无权访问 UserId。我如何处理表格?我试过了,这会引发错误:

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

我可以更改 userForm 的类型以接受 Maybe UserId 而不是仅接受 UserId 或者伪造一个 UserId 来调用 runFormPost但这两个都是黑客。有没有简单、干净的方法来做到这一点?

您可以使用 hiddenField,但几乎可以肯定 不是您真正想要的 (任何用户都可以通过以下方式欺骗 UserId提交不同的值)。假设您要尝试做的实际上是说 "who is the current user",您需要某种方法在 AJAX 处理程序(例如 requireAuthId)中安全地确定它。