如何从参数不可用的处理程序处理参数化的 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
)中安全地确定它。
我有以下表格:
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
)中安全地确定它。