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