2012-06-20 49 views
3

我想不通路由陌生感在快0.9(和,最有可能的,其他版本)快0.9路由行爲

我明白了「/」是一個包羅萬象的一切模式,除非我把iftop的處理程序中的功能, 對? 因此,使用(「/」,blah)路由,任何URL都應該由blah處理程序處理,對嗎?

使用snap init生成的默認應用程序進行播放時,我無法捕捉到根據請求渲染除index.tpl以外的任何內容。

定根( 「/」,等等),並處理

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

它呈現等等模板的任何URL,但根URL! 所以「/任何東西」呈現blah模板,但「/」呈現索引模板。

改變等等處理程序

blah = ifTop $ render "blah" 

沒有任何改變的行爲。 只有在這種情況下,我不能路由到「/任何東西」。路由到「/」仍呈現索引模板。 我錯過了什麼?我如何獲得「/」來呈現我選擇的模板?

回答

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用於root),那麼你的處理程序將不會有機會。

因此只需將addRoutes routes放置在heistInit以上(app位於默認模板的Site.hs中)。

+0

謝謝。我認爲索引模板的存在使其成爲默認的根。如果我有(「/」,blah)root,那麼一切都由blah函數處理,但不包括任何其他定義的根。鑑於上面的根,我可以附加任何隨機字符串「/」,它將被轉發到blah函數。對此有何評論?現在,「」帶有這個路由條目(「」,serveDirectory「static」)。那麼「」和「/」之間有什麼區別? –

+1

我剛試過。你是對的,「」和「/」是一樣的。我從答案中刪除了「」的聲明。 – Yuras