【问题标题】:How do I process a parameterized Yesod form from a handler where the parameter is unavailable?如何处理来自参数不可用的处理程序的参数化 Yesod 表单?
【发布时间】:2016-07-07 11:04:23
【问题描述】:

我有以下表格:

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,但这两者都是黑客行为。有没有一种简单、干净的方法来做到这一点?

【问题讨论】:

    标签: haskell yesod


    【解决方案1】:

    您可以使用hiddenField,但这几乎肯定不是您真正想要的(任何用户都可以通过提交不同的值来欺骗UserId)。假设您实际上是在说“谁是当前用户”,那么您需要某种方式在您的 AJAX 处理程序中安全地确定这一点(例如 requireAuthId)。

    【讨论】:

    • requireAuthId 解决方案适用于我的特殊情况,谢谢!在一般情况下,就像本书的表单部分一样,您的意思是拥有form :: Maybe UserId -&gt; Form Blog 并在UserId 字段中使用maybe hiddenField pure mbUid 之类的东西,对吗?因此,您将构建一个表单,其中包含 HTML 页面上的预填充字段和 POST 处理程序的隐藏字段。
    猜你喜欢
    • 1970-01-01
    • 2017-06-02
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多