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