Yesod:将当前用户传递给表单
Yesod: Passing the current user to a form
我找过这个,但找到的答案 最终出现在包含该值的列表中。我想知道是否有另一种更直接的方法来完成我需要的事情。
我有一个表格:
formReview :: UserId -> Form Review
formReview uid = renderDivs $ Review <$>
areq textField "Text" Nothing <*>
areq intField "Rating" Nothing <*>
areq (selectField films) "Film" Nothing <*>
pure uid
如您所见,我正在尝试将用户 ID 传递给表单,因为这些是要审核的字段:
Review
text Text
rating Int
film FilmId
author UserId
需要作者ID。
我尝试这样做的方法是在 postReviewsR:
上执行以下操作
postReviewsR :: Handler Html
postReviewsR = do
uid <- lookupSession "_ID"
case uid of
Nothing -> do
defaultLayout [whamlet| <h1> User isn't logged in.|]
Just uid ->
((result, _), _) <- runFormPost $ formReview uid
case result of
FormSuccess review -> do
runDB $ insert review
defaultLayout [whamlet|
<h1> Review posted.
|]
_ -> redirect ReviewsR
它必须是 Maybe,因为理论上你可以在不登录的情况下尝试 post 某些东西,所以 uid 可能是空的。如果我尝试直接转到 ((result, _), _) <- runFormPost $ formReview uid
它说有一个 Maybe Text
.
现在我的问题与另一个问题类似 post,是这个错误:
• Couldn't match type ‘Text’ with ‘Key User’
Expected type: UserId
Actual type: Text
• In the first argument of ‘formReview’, namely ‘uid’
In the second argument of ‘($)’, namely ‘formReview uid’
In a stmt of a 'do' block:
((result, _), _) <- runFormPost $ formReview uid
链接 post 中的建议是使用 keyToValues :: Key record -> [PersistValue]
将密钥(显然只是文本)转换为我需要的 UserId。
对我来说似乎太笨重了,我需要做所有这些,然后在该列表上使用 head
来获取其中的值,所有这些都是为了将 ID 放入表单中。必须有另一种更正确的方法,对吗?我在这里错过了什么?我如何获得在其中进行评论的用户的 ID?
编辑:我应该指出我没有使用 Yesod.Auth 所以我不能使用它的功能。
假设您使用的是 SQL 后端,请查看 persistent
SQL documentation。您会找到 toSqlKey :: ToBackendKey SqlBackend record => Int64 -> Key record
函数。基本上,您需要将 Text
解析为 Int64
并使用 toSqlKey
获取密钥。您应该可能 还要检查您获得的密钥是否真的有效。
(您显然误读了错误,您的 uid
只是一个 Text
值,但您需要一个 UserID
,它是一个 Key User
)。
我找过这个,但找到的答案
我有一个表格:
formReview :: UserId -> Form Review
formReview uid = renderDivs $ Review <$>
areq textField "Text" Nothing <*>
areq intField "Rating" Nothing <*>
areq (selectField films) "Film" Nothing <*>
pure uid
如您所见,我正在尝试将用户 ID 传递给表单,因为这些是要审核的字段:
Review
text Text
rating Int
film FilmId
author UserId
需要作者ID。 我尝试这样做的方法是在 postReviewsR:
上执行以下操作postReviewsR :: Handler Html
postReviewsR = do
uid <- lookupSession "_ID"
case uid of
Nothing -> do
defaultLayout [whamlet| <h1> User isn't logged in.|]
Just uid ->
((result, _), _) <- runFormPost $ formReview uid
case result of
FormSuccess review -> do
runDB $ insert review
defaultLayout [whamlet|
<h1> Review posted.
|]
_ -> redirect ReviewsR
它必须是 Maybe,因为理论上你可以在不登录的情况下尝试 post 某些东西,所以 uid 可能是空的。如果我尝试直接转到 ((result, _), _) <- runFormPost $ formReview uid
它说有一个 Maybe Text
.
现在我的问题与另一个问题类似 post,是这个错误:
• Couldn't match type ‘Text’ with ‘Key User’
Expected type: UserId
Actual type: Text
• In the first argument of ‘formReview’, namely ‘uid’
In the second argument of ‘($)’, namely ‘formReview uid’
In a stmt of a 'do' block:
((result, _), _) <- runFormPost $ formReview uid
链接 post 中的建议是使用 keyToValues :: Key record -> [PersistValue]
将密钥(显然只是文本)转换为我需要的 UserId。
对我来说似乎太笨重了,我需要做所有这些,然后在该列表上使用 head
来获取其中的值,所有这些都是为了将 ID 放入表单中。必须有另一种更正确的方法,对吗?我在这里错过了什么?我如何获得在其中进行评论的用户的 ID?
编辑:我应该指出我没有使用 Yesod.Auth 所以我不能使用它的功能。
假设您使用的是 SQL 后端,请查看 persistent
SQL documentation。您会找到 toSqlKey :: ToBackendKey SqlBackend record => Int64 -> Key record
函数。基本上,您需要将 Text
解析为 Int64
并使用 toSqlKey
获取密钥。您应该可能 还要检查您获得的密钥是否真的有效。
(您显然误读了错误,您的 uid
只是一个 Text
值,但您需要一个 UserID
,它是一个 Key User
)。