2017-06-13 56 views
1

我已經找了這個,但是找到的答案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,所以我不能使用它的功能。

回答

3

假設您正在使用SQL後端,請查看persistent SQL documentation。你會找到toSqlKey :: ToBackendKey SqlBackend record => Int64 -> Key record函數。基本上,您需要將您的Text解析爲Int64,並使用toSqlKey獲得密鑰。你應該可能也檢查你得到的密鑰是否真的有效。

(你顯然是誤讀了錯誤,你uid只是一個Text值,但你需要一個UserID這是一個Key User)。

+0

我正在使用postgresql,如果它有一個,我會尋找一個類似的函數。 – GeleiaDeMocoto

+0

如果您使用postgresql,則使用SQL後端。這是在'Persistent.SQL'中定義的,如果你使用帶有'persistent'的postgresql的話你使用的是'Persistent.SQL'。 – Cubic

相關問題