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.
Ich benutze Postgresql, ich werde nach einer ähnlichen Funktion suchen, wenn es eine hat. – GeleiaDeMocoto
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