我已經找了這個,但是找到的答案here最終出現在包含該值的列表中。我想知道是否沒有另一種更直接的方式來做我所需要的。Yesod:將當前用戶傳遞給表單
我有一個表格:
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
它必須是一個也許是因爲從理論上講,你可以嘗試發佈的東西沒有被登錄,所以UID可能是空的。如果我試圖直接去((result, _), _) <- runFormPost $ formReview uid
它說有Maybe Text
。
現在我的問題是類似的其他職位,它的這個錯誤:
• 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
,並在鏈接後的建議是使用keyToValues :: Key record -> [PersistValue]
轉動鑰匙,這顯然是文本,到我需要什麼,UserId。 對我來說,這似乎太笨重,我需要做所有這些,然後在該列表上使用head
來獲取其中的值,所有這些都將ID帶入表單中。必須有另一種更正確的方法,對嗎?我在這裏錯過了什麼?如何獲取進行審閱的用戶的ID?
編輯:我應該指出,我沒有使用Yesod.Auth,所以我不能使用它的功能。
我正在使用postgresql,如果它有一個,我會尋找一個類似的函數。 – GeleiaDeMocoto
如果您使用postgresql,則使用SQL後端。這是在'Persistent.SQL'中定義的,如果你使用帶有'persistent'的postgresql的話你使用的是'Persistent.SQL'。 – Cubic