我正在尝试使用 Snap 和 Heist 渲染模板。
我确信我的处理函数被正确调用(如果我用 undefined
替换处理函数的内容,它会按预期失败。 Debug.Trace.trace
也按预期工作)。
该处理函数由一行组成:render "template"
。但由于某种原因我得到 No handler accepted <url>
错误而不是 template not found
或类似的东西。
我认为这里的问题是我将模板放置在错误的目录中,但无法知道在哪里搜索模板。所以我的问题是:
- 此错误消息是否具有误导性?它应该类似于
template not found: template.tpl
- 我在哪里可以知道在哪些目录中搜索模板?
我认为 snap init
创建的 snap 应用程序是问题所在。我只对其做了一些微小的修改:
- 我又向
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.tpl
在snaplets/heist/myapp_templates
.
最佳答案
1.:我同意渲染模板应该存在两种不同类型的错误。遗憾的是,据我所知,情况并非如此。
2.: 简短回答: 使用的目录写在 heistInit 函数中。例如
h <- nestSnaplet "" heist $ heistInit "templates"
表示可以访问“snaplets/heist/templates/”中的所有文件,包括子目录。
长答案:
抢劫目录结构的默认行为如下: 所有 .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 文件的目录位置。 因此您可以根据需要进行调整。
我希望这能回答您的问题。
关于haskell - 抢夺 : why my template is not rendered?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20863979/