Snap 0.9路由行为

r.s*_*cky 3 haskell haskell-snap-framework

我无法弄清楚Snap 0.9中的路由奇怪(最有可能是其他版本)

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

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

给定root("/",blah)和处理程序

blah :: Handler App App ()
blah = render "blah"
Run Code Online (Sandbox Code Playgroud)

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

将blah处理程序改为

blah = ifTop $ render "blah"
Run Code Online (Sandbox Code Playgroud)

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

Yur*_*ras 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
Run Code Online (Sandbox Code Playgroud)

你看,它会打响addRoutes.所以,如果你打电话heistInit添加你自己的路由前(默认模板说),那么你的处理器就不会,如果有使用相同的名称(或在index.tpl根)模板,甚至有机会.

所以只需放在addRoutes routes上面heistInit(app在默认模板中的Site.hs中).