1

我刚刚开始编写自定义快照并遇到了障碍。我有以下基本 snaplet,它有一个位于“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

自定义 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"
4

2 回答 2

2

使用addTemplates而不是addTemplatesAt. 您可以从源代码中看到它与您在此处的内容略有不同。

此外,一个不相关的细节,您不需要Admin数据类型的类型参数。由于它不使用 b,因此您不需要它作为类型参数。

于 2013-05-12T17:35:00.827 回答
0

除了按照 mightybyte 的建议将 addTemplatesAt 更改为 AddTemplates 外,我还必须将 handleUsers 函数更改为:

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

自定义 snaplet 的 rootURL 是“pgadmin”,在调用 render 时必须包含在模板名称中。

于 2013-05-14T01:04:04.067 回答