Yesod - 带外键的表格

时间:2017-09-04 13:03:25

标签: haskell yesod yesod-forms

我正在使用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)

有没有一种标准方法可以解决这个问题?

2 个答案:

答案 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"