1

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

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

4

2 回答 2

1

如果您正在使用 SQL 后端,则toSqlKeyDatabase.Persist.Sql模块中。既然给定了Text,首先需要将其转换为Int64使用Data.Text.Read

于 2017-09-04T13:58:39.270 回答
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"
于 2017-09-06T07:14:12.273 回答