2012-03-13 13 views
5

Zajmuję się tworzeniem aplikacji internetowej z Clojure, obecnie z Ring, Moustache, Sandbar i Hiccup. Mam zasobu o nazwie praca oraz trasy, aby zobaczyć konkretny krok w formie wieloetapowej dla konkretnego zadania zdefiniowane następująco (przy innych drogach pominięta dla uproszczenia):Jak zaimplementować funkcjonalność podobną do url_for Railsów z Clojure i jego frameworkami sieciowymi?

(def web-app 
    (moustache/app 
    ;; matches things like "/job/32/foo/bar" 
    :get [["job" id & step] 
     (fn [req] (web.controllers.job/show-job id step))])) 

W widoku mojego kontrolera rendery, istnieją łącza do innych kroków w ramach tego samego zadania. Obecnie adresy URL są tworzone ręcznie, np. (str "/job/" id step). Nie podoba mi się ta zakodowana część adresu URL, ponieważ powtarza to, co zdefiniowałem na trasie wąsów; jeśli zmienię trasę, muszę zmienić kontroler, który jest ściślejszym sprzęgłem niż mi zależy.

wiem, że układ routingu szyn posiada metody do generowania adresów URL z parametrami i życzę miałem podobną funkcjonalność, tj Chciałbym mieć funkcję url-for że mogę nazwać tak:

(url-for :job 32 "foo" "bar") 
; => "/job/32/foo/bar" 

Czy istnieje framework sieciowy Clojure, który to ułatwia? Jeśli nie, to jakie są twoje przemyślenia na temat tego, w jaki sposób można to zrealizować?

Odpowiedz

4

Noir zapewnia something similar. Jest nawet nazywany url-for.

+0

Niezły! Spoglądałem na Noir wiele razy, ale do tej pory podobało mi się bardziej minimalistyczne podejście do wąsów. Zrobię dzisiaj mały eksperyment, żeby sprawdzić, czy Noir pasuje do moich potrzeb. – Gert

2

Wspomniana przykładowa funkcja może zostać zaimplementowana jak poniżej. Ale nie jestem pewien, czy to dokładnie to, czego szukasz.

(defn url-for [& rest] 
    (reduce 
     #(str %1 "/" %2) "" (map #(if (keyword? %1) (name %1) (str %1)) rest))) 
+0

Dzięki, ale to zasadniczo będzie takie samo, jak zakodowanie adresu URL, ponieważ funkcja ta po prostu przetłumaczy: zadanie na "/ zadanie /". – Gert