私はこれを探しましたが、答えがhereの場合、その値を含むリストになります。私は、必要なことをするための別の、より簡単な方法がないのだろうかと思っています。Yesod:フォームに現在のユーザーを渡す
私はフォームがあります:あなたはこれらのレビューのためのフィールドであるので、私は、フォームにユーザーIDを渡すためにしようとしている見ることができるよう
formReview :: UserId -> Form Review
formReview uid = renderDivs $ Review <$>
areq textField "Text" Nothing <*>
areq intField "Rating" Nothing <*>
areq (selectField films) "Film" Nothing <*>
pure uid
を:
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]
を使用することです、ユーザーID。 私はこれをすべてやる必要があると私にはあまりにも厄介なようだ、head
をそのリストの中で値を取得するために使用してください、すべてがフォームにIDを取得する。別の正しい方法がなければなりません、そうですか?私はここで何が欠けていますか?レビューを行っているユーザーのIDを取得するにはどうすればよいですか?
EDIT:私はYesod.Authを使用していないので、その機能を使用できないことを指摘しておきます。
私はpostgresqlを使用していますが、私はそれがある場合は同様の機能を探します。 – GeleiaDeMocoto
postgresqlを使用している場合は、SQLバックエンドを使用しています。これは 'Persistent.SQL'で定義されています。これは' persistent'でpostgresqlを使用している場合に使用しています。 – Cubic