5

在 Clojure 中进行路由和 URL 生成有哪些好方法(库或代码)?

我查看了 Compojure 源代码,但没有看到任何迹象表明它的路由也用于 URL 生成。还有什么?

如果您用证据和/或经验来支持它,那么“没有这样的图书馆”的答案实际上非常有用。

这个问题的动机来自Rails 路由指南的第一部分:“Rails 路由器识别 URL 并将它们分派给控制器的操作。它还可以生成路径和 URL,避免在视图中硬编码字符串的需要。”

亲爱的你:我知道有人(也许是你?)想说,“不要担心 URL 生成;只需为你的 URL 硬编码字符串”。是的,我知道我可以这样做,但这并不构成对这个问题的回答。:) 这不是关于组合路由和 URL 生成的智慧或优缺点的问题。这是关于你如何做到的?

4

4 回答 4

4

Pedestal的服务层同时进行路由和 URL 生成;此功能在 Pedestal 文档的服务路由部分进行了描述。

于 2013-05-28T00:32:18.330 回答
2

我刚刚遇到了路线一,它看起来就是这样做的。它是一个与 Compojure 完全兼容的小型库,并提供了一种定义可以反向运行的路由的方法。

从他们的文档中,您可以定义如下路线:

(defroute document "/documents/:document-id")

并且将生成几个辅助函数:

(document-path :document-id "123")
;; => "/documents/123"

(with-base-url "https://myservice.com"
   (document-url :document-id "123"))
;; => "https://myservice.com/documents/123"
于 2014-02-10T16:34:03.147 回答
1

我已经为 compojure 的路由宏编写了一个最小的替代品,它允许您命名路由模式并为它们生成 url。它位于https://github.com/joodie/clout-link

于 2013-05-28T19:22:35.987 回答
0

很久以后,但 Clojure 生态系统发生了很大变化:

  • 基座服务路由可以做到这一点(但需要为其他事情买单)
  • 比迪只做你描述的事情,并且与其他图书馆有很好的比较。

取自 bidi README,这是一个比较(使用Run code按钮):(我这样做是为了使用 HTML,因为 stackoverflow markdown 不支持表格)。

<table>
<thead>
<tr>
<th>Library</th>
<th>clj</th>
<th>cljs</th>
<th>Syntax</th>
<th>Isomorphic?</th>
<th>Self-contained?</th>
<th>Extensible?</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://github.com/weavejester/compojure">Compojure</a></td>
<td>✔&lt;/td>
<td></td>
<td>Macros</td>
<td></td>
<td>✔&lt;/td>
<td></td>
</tr>
<tr>
<td><a href="https://github.com/cgrand/moustache">Moustache</a></td>
<td>✔&lt;/td>
<td></td>
<td>Macros</td>
<td></td>
<td>✔&lt;/td>
<td></td>
</tr>
<tr>
<td><a href="https://github.com/clojurewerkz/route-one">RouteOne</a></td>
<td>✔&lt;/td>
<td></td>
<td>Macros</td>
<td>✔&lt;/td>
<td>✔&lt;/td>
<td></td>
</tr>
<tr>
<td><a href="http://pedestal.io/">Pedestal</a></td>
<td>✔&lt;/td>
<td></td>
<td>Data</td>
<td>✔&lt;/td>
<td></td>
<td></td>
</tr>
<tr>
<td><a href="https://github.com/thatismatt/gudu">gudu</a></td>
<td>✔&lt;/td>
<td></td>
<td>Data</td>
<td>✔&lt;/td>
<td>✔&lt;/td>
<td></td>
</tr>
<tr>
<td><a href="https://github.com/gf3/secretary">secretary</a></td>
<td></td>
<td>✔&lt;/td>
<td>Macros</td>
<td>✔&lt;/td>
<td>✔&lt;/td>
<td>✔&lt;/td>
</tr>
<tr>
<td><a href="https://github.com/DomKM/silk">silk</a></td>
<td>✔&lt;/td>
<td>✔&lt;/td>
<td>Data</td>
<td>✔&lt;/td>
<td>✔&lt;/td>
<td>✔&lt;/td>
</tr>
<tr>
<td><a href="https://github.com/Prismatic/fnhouse">fnhouse</a></td>
<td>✔&lt;/td>
<td></td>
<td>Macros</td>
<td></td>
<td></td>
<td>✔&lt;/td>
</tr>
<tr>
<td>bidi</td>
<td>✔&lt;/td>
<td>✔&lt;/td>
<td>Data</td>
<td>✔&lt;/td>
<td>✔&lt;/td>
<td>✔&lt;/td>
</tr>
</tbody>
</table>

于 2015-11-27T10:00:40.870 回答