3

我无法弄清楚 Snap 0.9(很可能还有其他版本)中的路由异常

我知道“/”是一个捕获所有内容的模式,除非我将 ifTop 函数放在处理程序中,对吧?因此,使用 ("/", blah) 路由,任何 URL 都应该由 blah 处理程序处理,对吗?

使用 snap init 生成的默认应用程序,除了根请求的 index.tpl 之外,我无法快速渲染任何内容。

给定根(“/”,等等)和处理程序

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

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

将 blah 处理程序更改为

blah = ifTop $ render "blah"

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

4

1 回答 1

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在添加自己的路由之前调用(默认模板会这样做),那么如果存在具有相同名称的模板(或 index.tpl 为根),您的处理程序甚至没有机会。

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

于 2012-06-20T09:07:24.057 回答