2013-05-28 32 views
5

Một số cách hay (thư viện hoặc mã) để thực hiện cả định tuyến và tạo URL trong Clojure là gì?Định tuyến ngược/tạo URL trong Clojure?

Tôi đã xem mã nguồn của Compojure, nhưng không thấy dấu hiệu nào cho thấy định tuyến của nó cũng có nghĩa là để phục vụ cho việc tạo URL. Còn gì ngoài kia?

Câu trả lời cho biết "không có thư viện nào" thực sự rất hữu ích, nếu bạn sao lưu bằng chứng và/hoặc trải nghiệm.

Động lực cho câu hỏi này xuất phát từ phần đầu tiên của Rails Routing Guide: "Bộ định tuyến Rails nhận dạng URL và gửi chúng đến hành động của bộ điều khiển. Nó cũng có thể tạo đường dẫn và URL, tránh yêu cầu mã hóa chuỗi trong chế độ xem của bạn. "

Bạn thân mến: Tôi biết một người nào đó ở đó (có thể là bạn?) Muốn nói, "đừng lo lắng về việc tạo URL; chỉ chuỗi mã cứng cho URL của bạn". Có, tôi biết tôi có thể làm điều đó, nhưng điều đó không cấu thành câu trả lời cho câu hỏi này. :) Đây là không phải câu hỏi về sự khôn ngoan hoặc ưu và nhược điểm của định tuyến kết hợp và tạo URL. Đó là khoảng làm thế nào để bạn làm điều đó?

Trả lời

4

Pedestal Lớp dịch vụ của cả hai định tuyến và tạo URL; chức năng này được mô tả trong phần Service Routing của tài liệu Bệ.

1

Tôi đã viết một thay thế tối thiểu cho các macro định tuyến của compojure cho phép bạn đặt tên mẫu định tuyến và tạo url cho chúng. Đó là số https://github.com/joodie/clout-link

2

Tôi vừa mới xem qua số route-one trông giống như vậy. Đó là một thư viện nhỏ hoàn toàn tương thích với Compojure, và cung cấp một cách xác định các tuyến đường có thể chạy ngược lại.

Từ tài liệu của họ, bạn có thể xác định một lộ trình như thế này:

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

Và một vài chức năng helper sẽ được tạo:

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

(with-base-url "https://myservice.com" 
    (document-url :document-id "123")) 
;; => "https://myservice.com/documents/123" 
0

Mãi về sau, nhưng hệ sinh thái Clojure đã chuyển khá một chút:

  • bệ service-routing thực hiện điều đó (nhưng yêu cầu mua cho những thứ khác)
  • bidi chỉ làm những gì bạn mô tả và cũng có so sánh tốt với các thư viện khác.

Taken từ README bidi, đây là một sự so sánh (sử dụng nút Run code): (Tôi đã làm điều đó để sử dụng HTML vì stackoverflow markdown không có hỗ trợ bảng).

<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>✔</td> 
 
<td></td> 
 
<td>Macros</td> 
 
<td></td> 
 
<td>✔</td> 
 
<td></td> 
 
</tr> 
 
<tr> 
 
<td><a href="https://github.com/cgrand/moustache">Moustache</a></td> 
 
<td>✔</td> 
 
<td></td> 
 
<td>Macros</td> 
 
<td></td> 
 
<td>✔</td> 
 
<td></td> 
 
</tr> 
 
<tr> 
 
<td><a href="https://github.com/clojurewerkz/route-one">RouteOne</a></td> 
 
<td>✔</td> 
 
<td></td> 
 
<td>Macros</td> 
 
<td>✔</td> 
 
<td>✔</td> 
 
<td></td> 
 
</tr> 
 
<tr> 
 
<td><a href="http://pedestal.io/">Pedestal</a></td> 
 
<td>✔</td> 
 
<td></td> 
 
<td>Data</td> 
 
<td>✔</td> 
 
<td></td> 
 
<td></td> 
 
</tr> 
 
<tr> 
 
<td><a href="https://github.com/thatismatt/gudu">gudu</a></td> 
 
<td>✔</td> 
 
<td></td> 
 
<td>Data</td> 
 
<td>✔</td> 
 
<td>✔</td> 
 
<td></td> 
 
</tr> 
 
<tr> 
 
<td><a href="https://github.com/gf3/secretary">secretary</a></td> 
 
<td></td> 
 
<td>✔</td> 
 
<td>Macros</td> 
 
<td>✔</td> 
 
<td>✔</td> 
 
<td>✔</td> 
 
</tr> 
 
<tr> 
 
<td><a href="https://github.com/DomKM/silk">silk</a></td> 
 
<td>✔</td> 
 
<td>✔</td> 
 
<td>Data</td> 
 
<td>✔</td> 
 
<td>✔</td> 
 
<td>✔</td> 
 
</tr> 
 
<tr> 
 
<td><a href="https://github.com/Prismatic/fnhouse">fnhouse</a></td> 
 
<td>✔</td> 
 
<td></td> 
 
<td>Macros</td> 
 
<td></td> 
 
<td></td> 
 
<td>✔</td> 
 
</tr> 
 
<tr> 
 
<td>bidi</td> 
 
<td>✔</td> 
 
<td>✔</td> 
 
<td>Data</td> 
 
<td>✔</td> 
 
<td>✔</td> 
 
<td>✔</td> 
 
</tr> 
 
</tbody> 
 
</table>

Các vấn đề liên quan