2017-06-13 4 views
1

Ich habe nach diesem gesucht, aber die Antwort here endet auf einer Liste mit dem Wert. Ich frage mich, ob es nicht einen anderen, einfacheren Weg gibt, zu tun, was ich brauche.Jessod: Übergeben des aktuellen Benutzers an ein Formular

Ich habe ein Formular:

formReview :: UserId -> Form Review 
formReview uid = renderDivs $ Review <$> 
       areq textField "Text" Nothing <*> 
       areq intField "Rating" Nothing <*> 
       areq (selectField films) "Film" Nothing <*> 
       pure uid 

wie man sehen kann Ich versuche, eine Benutzer-ID in das Formular zu übergeben, weil diese die Felder für die Bewertung sind:

Review 
    text Text 
    rating Int 
    film FilmId 
    author UserId 

es erfordert die ID des Autors. So wie ich bin versucht, dies zu tun ist durch die folgende auf postReviewsR tun:

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 

es hat ein Vielleicht, weil in der Theorie könnten Sie versuchen, etwas zu schreiben, ohne angemeldet zu sein, so uid leer sein könnte . Wenn ich versuche, direkt zu ((result, _), _) <- runFormPost $ formReview uid zu gehen, heißt es dort ist ein Maybe Text.

Nun mein Problem die andere Post ähnlich ist, ist es dieser Fehler ist:

• 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 

und der Vorschlag, in dem verlinkten Beitrag wird keyToValues :: Key record -> [PersistValue] zu verwenden, um den Schlüssel zu drehen, die scheinbar nur Text ist, in dem, was ich brauche , die Benutzer-ID. Es scheint zu klobig zu mir, dass ich all dies tun müsste, dann head auf dieser Liste verwenden, um den Wert innerhalb zu bekommen, alle, um die ID in das Formular zu bekommen. Es muss einen anderen, korrekteren Weg geben, oder? Was fehlt mir hier? Wie erhalte ich die ID des Benutzers, der die Überprüfung durchführt?

EDIT: Ich sollte darauf hinweisen, dass ich nicht Yesod.Auth verwende, damit ich seine Funktionen nicht verwenden kann.

Antwort

3

Angenommen, Sie verwenden ein SQL-Backend, überprüfen Sie die persistent SQL documentation. Sie finden die toSqlKey :: ToBackendKey SqlBackend record => Int64 -> Key record Funktion. Im Grunde müssen Sie Ihre zu Int64 analysieren und einen Schlüssel mit toSqlKey erhalten. Sie sollten wahrscheinlich auch überprüfen, ob der Schlüssel, den Sie erhalten, tatsächlich gültig ist.

(Sie offenbar den Fehler falsch verstanden haben, Ihre uid ist nur ein Text Wert, aber man braucht ein UserID, die ein Key User ist).

+0

Ich benutze Postgresql, ich werde nach einer ähnlichen Funktion suchen, wenn es eine hat. – GeleiaDeMocoto

+0

Wenn Sie postgresql verwenden, verwenden Sie ein SQL-Backend. Dies ist in 'Persistent.SQL' definiert, das Sie verwenden, wenn Sie postgresql mit' persistent' verwenden. – Cubic

Verwandte Themen