在compojure中动态添加路由

时间:2012-05-24 21:40:13

标签: dynamic path clojure compojure

大家好:我有一个“等级”风格的网站,其中有一个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可能已经有了这样的功能。

1 个答案:

答案 0 :(得分:1)

做你说的大部分内容都很简单。

有两件事你特别想看,以及一些一般的阅读,它们将帮助你理解正在发生的事情。

首先,您将要查看某种形式的HTML模板工具。虽然可以只构建必要的字符串,但如果使用它,事情会更简单。我已经看到了两种不同的主要风格,选择哪种取决于你的口味。

  • Hiccup专注于采用Clojure数据结构并将其转换为HTML
  • Enlive专注于获取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,这是一个很好的工作框架,可以很好地整合所有部分并解决一些常见问题。过程