我正在尝试使用Yesod web框架构建rest服务。我可以通过Id获取条目,但不能通过唯一的键获取它们。这是因为getBy404的类型签名不同于get404。getBy404返回包装在实体中的值,get404返回纯值。
module Handler.MusicaUser where
import Import
getMusicaUserR :: MusicaUserId -> Handler Value
getMusicaUserR pid = do
post <- runDB $ get404 pid
return $ object ["user" .= (Entity pid post)]
putMusicaUserR :: MusicaUserId -> Handler Value
putMusicaUserR pid = do
post <- requireJsonBody :: Handler MusicaUser
runDB $ replace pid post
sendResponseStatus status200 ("UPDATED" :: Text)
deleteMusicaUserR :: MusicaUserId -> Handler Value
deleteMusicaUserR pid = do
runDB $ delete pid
sendResponseStatus status200 ("DELETED" :: Text)我已经尝试用这个例子修改我的代码。
为什么这段代码适用于Yesod.Persister的get404而不是getBy404?
谢谢。谢谢你的帮助。
编辑
我想我越来越近了
getMusicaUserR :: Int64 -> Handler Value
getMusicaUserR facebookId = do
user <- runDB $ getBy404 (UniqueFacebookId facebookId)
return $ object ["user" .= (user)]我现在所犯的错误是
Application.hs:41:1:
Couldn't match type ‘Int64’ with ‘Key MusicaUser’
Expected type: MusicaUserId
Actual type: Int64
In the first argument of ‘MusicaUserR’, namely ‘dyn_al6K’
In the first argument of ‘Just’, namely ‘MusicaUserR dyn_al6K’Int64是我的函数的正确类型。我之所以使用它,是因为facebookId是如何在我的模型中定义的。我也尝试过使用UniqueFacebookId。
要修复上述错误,我需要将路由定义更改为
/user/#Int64 64而不是/user/MusicaUserId
发布于 2015-10-19 09:57:12
当您查看实体的定义时,您可以看到它只是一个实体的容器,它是键。您可以使用两个函数entityKey和entityVal从getBy404的返回值中提取键和值。
https://stackoverflow.com/questions/33197918
复制相似问题