【问题标题】:Snap Framework: Custom snaplet handler won't render templateSnap 框架:自定义 snaplet 处理程序不会呈现模板
【发布时间】:2013-05-14 10:41:03
【问题描述】:

我刚刚开始编写自定义 snaplet,但遇到了障碍。我有以下基本 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"

【问题讨论】:

    标签: haskell-snap-framework


    【解决方案1】:

    使用addTemplates 而不是addTemplatesAt。您可以从source code 看到它与您这里的略有不同。

    另外,一个无关紧要的细节,您不需要Admin 数据类型的类型参数。由于它不使用b,所以不需要它作为类型参数。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 我认为如果你将 'nestSnaplet "pgadmin"' 更改为 'nestSnaplet ""' 你就不需要这样做了。
      • 是的,这也有效,对我来说这是一个合理的解决方案,因为我提前知道了基本 snaplet 和 subsnaplet 的所有路由,并且可以避免路由冲突。在构建供其他人使用的独立 snaplet 时,这将是一个问题,因为可能与主应用程序发生路由冲突。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-22
      • 2017-10-06
      • 1970-01-01
      相关资源
      最近更新 更多