1

既存のYesodアプリケーションを、mongoではなくSQLバックエンドで実行するように変更しています。生成されたテーブル構造は、mongoバックエンドよりも厳密です。外部キー参照は、挿入時に正しく作成する必要があります。

postFeedingsR :: Handler RepJson
postFeedingsR  = do
  muser <- maybeAuth
  parsedFeeding <- parseJsonBody_ --get content as JSON
  let userId = getUserId muser
  let feedingWithUser = Feeding (feedingDate parsedFeeding) (feedingSide parsedFeeding) (feedingTime parsedFeeding) (feedingExcrements parsedFeeding) (feedingRemarks parsedFeeding) userId --should be linked to user..
  fid <- runDB $ insert feedingWithUser --store in database
  --runDB $ update fid [ FeedingUserId =. userId ] --Old mongo style of linking the feeding to the user
  sendResponseCreated $ FeedingR fid --return the id

parseJsonBodyから取得したエンティティをmaybeAuthのユーザーUIDで更新しようとしています。ただし、これにより次のエラーが発生します。

No instance for (aeson-0.6.0.2:Data.Aeson.Types.Class.FromJSON
                   (FeedingGeneric backend0))
  arising from a use of `parseJsonBody_'
Possible fix:
  add an instance declaration for
  (aeson-0.6.0.2:Data.Aeson.Types.Class.FromJSON
     (FeedingGeneric backend0))
In a stmt of a 'do' block: parsedFeeding <- parseJsonBody_
In the expression:
  do { muser <- maybeAuth;
       parsedFeeding <- parseJsonBody_;
       let userId = getUserId muser;
       let feedingWithUser
             = Feeding
                 (feedingDate parsedFeeding)
                 (feedingSide parsedFeeding)
                 (feedingTime parsedFeeding)
                 (feedingExcrements parsedFeeding)
                 (feedingRemarks parsedFeeding)
                 userId;
       .... }
In an equation for `postFeedingsR':
    postFeedingsR
      = do { muser <- maybeAuth;
             parsedFeeding <- parseJsonBody_;
             let userId = ...;
             .... }

なぜこれが起こるのかわかりません。誰かがこれを解決するために私を正しい方向に向けることができますか?

4

1 に答える 1

0

認証行を次のように変更することで解決しました。

Entity uid u <- requireAuth

そして関数を追加することによって:

addUserToFeeding :: UserId -> Feeding -> Feeding                                                                                                                                                            
addUserToFeeding uid Feeding {feedingDate=date, feedingSide=side, feedingTime=time, feedingExcrements=ex, feedingRemarks=remarks} = Feeding date side time ex remarks uid     

関連付けられたユーザーで新しいフィードを作成します。この給餌は、通常の方法でYesodに保存できます。

let feedingWithUser = addUserToFeeding uid parsedFeeding                                                                                                                                              
fid <- runDB $ insert feedingWithUser --store in database                                
于 2012-11-17T08:55:49.203 に答える