如何配置指向同一实体的多条路由的yesod?

时间:2014-06-30 00:28:48

标签: haskell yesod

我有一个带有两个处理程序的yesod路由 - 一个用于GET,一个用于PUT:

getHotspotR :: Key Hotspot -> Handler Value
getHotspotR i = do
        hotspot <- runDB $ get404 i
        returnJson hotspot

putHotspotR :: Handler ()
putHotspotR = do  
        hotspot <- requireJsonBody
        hid <- runDB $ insert $ hotspot
        sendResponseCreated $ HotspotR hid 

但我不知道该如何处理路由。如果我这样做:

/hotspot/#HotspotId HotspotR GET PUT

它抱怨PUT处理程序有错误的空气:

  Couldn't match expected type `Key Hotspot -> HandlerT App IO res0'
                with actual type `HandlerT App IO ()'
    The function `putHotspotR' is applied to one argument,
    but its type `Handler ()' has none

但如果我宣布另一条路线:

/hotspot/#HotspotId HotspotR GET 
/hotspot HotspotR PUT 

它抱怨说我有一条重复的路线:

/hotspot/#HotspotId HotspotR GET 
/hotspot HotspotR PUT 

Foundation.hs:48:1:
    Multiple declarations of `HotspotR'
    Declared at: Foundation.hs:48:1
                 Foundation.hs:48:1

1 个答案:

答案 0 :(得分:4)

逻辑上,这些资源并不相同,即使它们操纵实体。 HotspotR操纵一个热点。 HotspotsR操纵热点集(例如通过插入该集合)。

确保路线的名称不同。

/hotspots/           HotspotsR PUT
/hotspots/#HotspotId HotspotR  GET

然后相应地修改你的put资源。

putHotspotsR :: Handler ()
putHotspotsR = do { ... }

这样您将来也可以执行以下操作。

/hotspots/           HotspotsR GET PUT   -- list all hotspots, insert a hotspot
/hotspots/#HotspotId HotspotR  GET PATCH -- Get a hotspot, update a hotspot.