2013-05-11 72 views
1

我剛剛開始編寫自定義snaplets並命中路障。我有以下基本snaplet,它具有位於「snaplets/admin-pg/snaplets/heist/templates」中的「角色」模板。有人能告訴我爲什麼handleUsers函數不呈現「角色」模板?我收到「沒有處理程序接受」/ pgadmin/users'「錯誤。我相信我錯過了一些非常基本的東西。謝謝。捕捉框架:自定義的snaplet處理程序不會呈現模板

我的主應用程序定義如下。這是HasHeist的實例

data App = App 
    { _heist :: Snaplet (Heist App) 
    , _pgadmin :: Snaplet (Admin App) 
    } 

我在主應用程序( 「Site.hs」)的snaplet initializtion代碼:

h <- nestSnaplet "" heist $ heistInit "templates" 
z <- nestSnaplet "pgadmin" pgadmin $ adminPGInit h 

定製snaplet代碼...

data Admin b = Admin { name :: String} 

adminPGInit :: HasHeist a => Snaplet (Heist a) -> SnapletInit a (Admin a) 
adminPGInit h = makeSnaplet "admin-pg" description datadir $ do 
    config <- getSnapletUserConfig 
    fp <- getSnapletFilePath 
    addTemplatesAt h "" fp 
    addRoutes [ ("/users", handleUsers) 
      , ("/foo", handleFoo)] 

    return $ Admin "Admin Snaplet" 
    where 
     description = "PostgreSQL Admin" 
     datadir = Just $ liftM (++"/resources") getDataDir 



handleUsers :: HasHeist b => Handler b (Admin b)()  
handleUsers = do 
    render "roles" 

handleFoo :: HasHeist b => Handler b (Admin b)() 
handleFoo = writeBS "foo from admin" 

回答

2

使用addTemplates而不是addTemplatesAt。你可以從source code看到,它與你在這裏的有些不同。

另外,無關細節,您不需要Admin數據類型的類型參數。由於它不使用b,因此不需要它作爲類型參數。

+0

這樣做。謝謝! – 2013-05-12 18:27:28

0

隨着改變addTemplatesAt到AddTemplates爲mightybyte的建議,我也只好在handleUsers功能更改爲:

handleUsers = do 
    rURL <- getSnapletRootURL 
    render $ rURL `BS.append` "/roles" 

自定義snaplet則rootURL是「pgAdmin的」,這已被包含在模板名稱當調用渲染。

+0

我想如果你把'nestSnaplet'pgadmin''改爲'nestSnaplet''',你就不需要這樣做。 – mightybyte 2013-05-14 22:05:17

+0

是的,這也行得通,對我來說這是一個合理的解決方案,因爲我事先知道基本snaplet和subnaplet的所有路由,並且可以避免路由衝突。當建立一個獨立的snaplet供他人使用時,這將是一個問題,因爲潛在的路線與主應用程序衝突。 – 2013-05-15 14:11:17

相關問題