2015-10-18 12 views
1

我想使用Yesod web框架构建一个休息服务。我可以通过Id获取条目,但我无法通过唯一键获取它们。这是因为getBy404的类型签名与get404不同。 getBy404返回包裹在实体中的值,get404返回纯值。getBy404 vs 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) 

我试图修改我的代码使用这个例子

Why does this code work with Yesod.Persist's get404 but not 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。

要解决我需要改变我的路线定义,

上述错误

/用户/#的Int64而不是/用户/ MusicaUserId

回答

1

当你看the definition of Entity,你可以看到,它仅仅是一个一个实体的容器,它是关键。您可以使用entityKeyentityVal这两个函数来提取密钥和返回值getBy404的值。

+0

非常感谢@madjar。我想我已经接近了。还不够。 –

+0

您在编辑时添加的错误看起来不像函数的问题。也许你的路由定义有问题:它应该是'/ something /#Int64'的形式,而不是'/ something /#MusicaUserId',因为路由函数需要Int64。 – madjar

+0

非常感谢你!!!!!令人难以置信的是,路线是安全的。创建一个使用Int64创建一个facebookId类型的新类型会是一个好主意吗? –

相关问题