我正在使用Yesod开发我的第一个应用程序,我正在创建一些CRUD api来启动。
我的模型看起来像
User json
...
Activity json
userId UserId
...
其中userId
是外键。
我需要创建一个端点才能创建新的Activity,而客户端需要能够指定userId
。
要做到这一点,我使用的是
这样的表格postCreateActivityR :: Hadler Value
postCreateActivityR = do
activity <- runInputPost $ Activity
<$> ...
<*> ireq textField "userId"
...
这样做我收到如下错误:
Couldn't match type ‘Text’ with ‘Key User’ expected type: FormInput (HandlerT App IO) (Key User)
有没有一种标准方法可以解决这个问题?
答案 0 :(得分:1)
如果您正在使用SQL后端,Database.Persist.Sql模块中有toSqlKey
。由于您获得Text
,因此首先需要使用Data.Text.Read将其转换为Int64
。
答案 1 :(得分:1)
对于记录,这就是我最终解决的问题
我必须创建一个新字段
userIdField :: (Monad m, RenderMessage (HandlerSite m) FormMessage) => Field m UserId
userIdField = Field
{ fieldParse = parseHelper $ \s ->
case signed decimal s of
Right (a, "") -> Right $ toSqlKey a
_ -> Left $ MsgInvalidInteger s
, fieldView = \_ _ _ _ _ -> ""
, fieldEnctype = UrlEncoded
}
然后像
一样使用它<*> ireq userIdField "userId"