2

嗨,伙计们:我有一个“层次结构”风格的网站,有一个像这样的 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 可能已经具有这样的功能,因为最近兴起了许多基于这种成语的博客平台。

4

1 回答 1

1

做你说的大部分是相当简单的。

您需要特别关注两件事,以及一些有助于您了解正在发生的事情的一般性阅读材料。

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

  • Hiccup专注于获取 Clojure 数据结构并将其转换为 HTML
  • Enlive专注于获取 HTML 模板文件并将它们转换为正确的最终形式

要实际获取文件列表,请考虑使用file-seq. 将文件名转换为适当的帖子名称和文件,然后将其用作数据以生成指向页面的链接。

您还想了解更多关于Compojure 路由模板和关于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,这是一个框架,可以很好地整合所有部分并解决过程中的一些常见问题。

于 2012-05-24T23:40:10.247 回答