Yesod - 带外键的表格

Yesod - Form with foreign key

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

有解决这个问题的标准方法吗?

如果您使用 SQL 后端,则 Database.Persist.Sql module. Since you are given Text, you first need to convert it into Int64 using Data.Text.Read 中有 toSqlKey

记录一下,最后我是这样解决的

我必须创建一个新字段

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"