Snap Framework:自定义snaplet处理程序不会呈现模板

时间:2013-05-11 02:02:49

标签: haskell-snap-framework

我刚开始编写自定义快照并点击路障。我有以下基本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"

2 个答案:

答案 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时必须包含在模板名称中。