2017-06-13 21 views
1

私はこれを探しましたが、答えが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を使用していないので、その機能を使用できないことを指摘しておきます。

答えて

3

SQLバックエンドを使用していると仮定すると、persistent SQL documentationをチェックしてください。 toSqlKey :: ToBackendKey SqlBackend record => Int64 -> Key recordの機能があります。基本的には、TextInt64に解析し、toSqlKeyを使用してキーを取得する必要があります。 も、実際に有効なキーがあるかどうかを確認する必要があります。

(あなたは明らかに誤りを読み違えてきた、あなたのuidはちょうどText値ですが、あなたはKey UserあるUserIDが必要)。

+0

私はpostgresqlを使用していますが、私はそれがある場合は同様の機能を探します。 – GeleiaDeMocoto

+0

postgresqlを使用している場合は、SQLバックエンドを使用しています。これは 'Persistent.SQL'で定義されています。これは' persistent'でpostgresqlを使用している場合に使用しています。 – Cubic

関連する問題