我刚开始编写自定义快照并点击路障。我有以下基本snaplet,其中“roles”模板位于“snaplets / admin-pg / snaplets / heist / templates”中。有人能告诉我为什么handleUsers函数不呈现“角色”模板吗?我收到“没有处理程序接受'/ pgadmin / users'”错误。我确定我遗漏了一些非常基本的东西。感谢。
我的主应用程序定义如下。它是HasHeist的一个实例
data App = App
{ _heist :: Snaplet (Heist App)
, _pgadmin :: Snaplet (Admin App)
}
我在主应用程序(“Site.hs”)中的snaplet的初始化代码是:
h <- nestSnaplet "" heist $ heistInit "templates"
z <- nestSnaplet "pgadmin" pgadmin $ adminPGInit h
自定义快照代码...
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"
答案 0 :(得分:2)
使用addTemplates
代替addTemplatesAt
。您可以从source code看到它与您在此处略有不同。
此外,一个不相关的细节,您不需要Admin
数据类型的类型参数。由于它不使用b,因此不需要它作为类型参数。
答案 1 :(得分:0)
除了将addTemplatesAt更改为adybyte建议的AddTemplates外,我还必须将handleUsers函数更改为:
handleUsers = do
rURL <- getSnapletRootURL
render $ rURL `BS.append` "/roles"
自定义snaplet的rootURL是“pgadmin”,在调用render时必须包含在模板名称中。