我无法弄清楚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"
不会改变任何行为。 只有在这种情况下,我不能路由到“/任何”。路由到“/”仍然呈现索引模板。 我错过了什么?如何使用“/”来渲染我选择的模板?
答案 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
)之上。