Snap 0.9路由行为

时间:2012-06-20 07:28:07

标签: haskell haskell-snap-framework

我无法弄清楚Snap 0.9中的路由陌生感(很可能是其他版本)

我理解“/”是一个捕获所有模式,除非我把ifTop函数放在处理程序中,对吧? 所以,使用(“/”,blah)路由,任何URL都应该由blah处理程序处理,对吗?

使用snap init生成的默认应用程序,除了index.tpl之外,我无法使用snap来呈现根请求。

给定root(“/”,blah)和handler

blah :: Handler App App ()
blah = render "blah"

它为任何URL呈现blah模板,但是根URL! 所以“/ anything”呈现blah模板,但“/”呈现索引模板。

将blah处理程序更改为

blah = ifTop $ render "blah"

不会改变任何行为。 只有在这种情况下,我不能路由到“/任何”。路由到“/”仍然呈现索引模板。 我错过了什么?如何使用“/”来渲染我选择的模板?

1 个答案:

答案 0 :(得分:5)

如果您有“index.tpl”模板,那么无论如何它都将用于渲染根页面。问题是heistInit功能:

heistInit :: FilePath                 -- ^ Path to templates
          -> SnapletInit b (Heist b)
heistInit templateDir = do
    makeSnaplet "heist" "" Nothing $ do
        hs <- heistInitWorker templateDir defaultHeistState
        addRoutes [ ("", heistServe) ]
        return hs

您看到它会调用addRoutes。因此,如果您在添加自己的路由之前调用heistInit(默认模板确实那么),那么如果存在具有相同名称(或索引)的模板,您的处理程序将不会有机会.tpl for root)。

因此,只需将addRoutes routes放在heistInit(默认模板中的Site.hs中app)之上。