大家好:我有一个“等级”风格的网站,其中有一个defroutes声明,如下所示:
(defroutes main-routes
(GET "/" [] (resp/redirect "/public/index.html")
(GET "/blog" [] (resp/redirect "/public/blogs/index.html")
(GET "/tools" [] (resp/redirect "/public/tools/index.html"))
但是,我希望这些页面更加动态 - 也就是说,我希望通过扫描/ blog目录的内容来生成index.html页面,同样地,对于/ tools路由也是如此。
也就是说,最后,我希望路线看起来像这样:
(defroutes main-routes
(GET "/" [] (resp/redirect "/public/index.html")
(GET "/blog" [] (generate-index "/public/blog"))
(GET "/tools" [] (generate-index "/public/tools")))
是否有通过compojure在我的网站上构建动态路径的简单路线图?
更具体一点----有没有关于如何构建(生成索引)函数的建议,该函数扫描输入的路径并返回所有文件的链接?考虑到最近这么多基于这种习语的博客平台的兴起,我认为compojure可能已经有了这样的功能。
答案 0 :(得分:1)
做你说的大部分内容都很简单。
有两件事你特别想看,以及一些一般的阅读,它们将帮助你理解正在发生的事情。
首先,您将要查看某种形式的HTML模板工具。虽然可以只构建必要的字符串,但如果使用它,事情会更简单。我已经看到了两种不同的主要风格,选择哪种取决于你的口味。
要实际获取文件列表,请考虑使用file-seq
。将文件名转换为适当的帖子名称和文件,然后将其用作数据以生成指向页面的链接。
您想要了解更多信息的另一件事是Compojure route templates以及Ring Responses上的更多内容。
Compojure的路径模板可以轻松传递路径参数,然后您可以从中生成响应。下面是一个简单的示例,它使用html页面名称作为参数提供简单的静态html文件。
(GET "/blog/:post" [post] (ring/file-response (str "/public/blogs/" post ".html")))
最后,考虑阅读Compojure和Ring wiki的其余部分。 Ring wiki提供了一些关于“如何工作”核心的非常好的信息。 Compojure wiki提供了一些关于如何最好地利用Compojure的好例子,它只关注提供一种简单的方法 - 但远非唯一的方法 - 处理路由并使Ring的页面生成变得容易。
根据您希望网站的位置,我还会考虑查看Noir,这是一个很好的工作框架,可以很好地整合所有部分并解决一些常见问题。过程