在Yesod中持有具有用户引用的实体?

时间:2012-11-16 16:36:18

标签: json haskell yesod

我正在将我现有的Yesod应用程序更改为在SQL后端而不是mongo上运行。生成的表结构比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

我尝试使用maybeAuth中的用户UID更新我从parseJsonBody获得的实体。但是,这给了我以下错误:

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 = ...;
             .... }

我不确定为什么会这样。谁能让我朝着正确的方向解决这个问题?

1 个答案:

答案 0 :(得分:0)

通过将auth行更改为:

来解决
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     

使用关联用户创建新的Feed。然后可以在Yesod中以正常方式存储该喂食:

let feedingWithUser = addUserToFeeding uid parsedFeeding                                                                                                                                              
fid <- runDB $ insert feedingWithUser --store in database