3

我正在尝试使用 Snap 和 Heist 渲染模板。

我确定我的处理函数被正确调用(如果我用 替换处理函数的内容undefined,它会按预期失败。Debug.Trace.trace也可以按预期工作)。

这个处理函数由一行组成:render "template". 但由于某种原因,我得到了No handler accepted <url>错误而不是 atemplate not found或类似的东西。

我认为这里的问题是我将模板放在错误的目录中,但是无法知道在哪里搜索模板。所以我的问题是:

  1. 这个错误信息不是误导吗?它应该是这样的template not found: template.tpl
  2. 我在哪里可以知道在哪些目录中搜索模板?

我认为由创建的快照应用程序snap init是问题所在。我只对它进行了轻微的修改:

  • 我又添加了一个字段来App记录:_myapp :: Snaplet Myapp
  • app初始化函数中,我添加了:n <- embedSnaplet "myapp" myapp myappInit然后将 n 传递给记录。
  • 我创建了新文件src/Myapp.hs

以下是中的相关部分Myapp.hs

myappInit = do
    ...
    h <- nestSnaplet "" heist $ hesitInit "myapp_templates"
    addRoutes routes
    ...

routes = [ ("/submit", submitHandler) ]

submitHandler = trace "rendering submit" $ render "submit"

但是由于某种原因,即使我rendering submit在转到时看到打印到控制台,我也会http://0.0.0.0:8000/myapp/submit收到No handler accepted "/hsnews/submit"作为 HTTP 响应的消息(而不是呈现的模板)。我有submit.tpl_submit.tplsnaplets/heist/myapp_templates.

4

2 回答 2

2

1.:我同意渲染模板应该有两种不同类型的错误。可悲的是,据我所知,情况并非如此。

2.:简短回答:使用的目录写在你的 heistInit 函数中。例如

h <- nestSnaplet "" heist $ heistInit "templates"

表示“snaplets/heist/ templates/ ”中的所有文件都可以访问,包括子目录。


长答案:

heist 目录结构的默认行为如下:所有 .tpl 文件都可以从 snaplet/heist/templates/ 目录访问。意义

addRoutes [("template", render "template")]

将访问该文件

snaplets/heist/templates/template.tpl

可以在 url 访问

http://localhost:8000/template

您还可以使用子目录,例如:

addRoutes [("users", render "users/index")]
path = snaplets/heist/templates/users/index.tpl
url  = http://localhost:8000/users

要修改此行为,您可以调整 heistInit 函数。

假设您希望目录路径为“snaplets/heist/”而不是“snaplets/heist/templates/”

只需更改:

h <- nestSnaplet "" heist $ heistInit "templates"

对此:

h <- nestSnaplet "" heist $ heistInit ""

heistInit 的参数是 tpl 文件的目录位置。所以你可以随心所欲地调整它。

我希望这回答了你的问题。

于 2014-01-01T01:06:02.887 回答
1

阁楼的回答很好,但没有解决我的问题。nestSnaplet这是因为和之间的差异embedSnaplet

我认为embedSnaplet's 文档没有提到这种差异:

运行另一个 snaplet 的初始化程序并返回初始化的 Snaplet 值。this 和 nestSnaplet 的区别在于第三个参数中的第一个类型参数。“v1 v1”使子 snaplet 认为它是顶级的,这意味着它将无法使用 snaplet 树中包含在它上面的 snaplet 提供的功能。这强烈地隔离了子 snaplet,并允许您消除 b 类型变量。嵌入式 snaplet 仍然可以从其他 snaplet 获得功能,但前提是它嵌套或嵌入了 snaplet 本身。

但也有这个区别,在 中embedSnaplet,子 snaplet 有一个新的根目录,snaplets/embeddedSnapletName并且嵌入式 snaplet 的所有子 snaplet 都将使用snaplets/embeddedSnapletName文件夹作为根目录。

所以我不得不把我的templates文件夹放在那里snaplets/myapp/templates,这样就解决了。

于 2014-01-01T05:54:55.960 回答