2012-03-13 10 views
5

Estoy desarrollando una aplicación web con Clojure, actualmente con Ring, Moustache, Sandbar y Hiccup. Tengo un recurso denominado trabajo y una ruta para mostrar un paso en particular en forma de múltiples pasos para un trabajo concreto definido como esto (otras vías omitido por simplicidad):¿Cómo implementaría una funcionalidad similar a la url_for de Rails con Clojure y sus frameworks web?

(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))])) 

En la vista de mi regulador Renders, hay enlaces a otros pasos dentro del mismo trabajo. Por el momento, estas URL se construyen a mano, p. (str "/job/" id step). No me gusta esa parte codificada de "/job/" de la url, porque repite lo que definí en la ruta del bigote; si cambio la ruta, necesito cambiar mi controlador, que es un acoplamiento más apretado de lo que me importa.

sé que sistema de enrutamiento de Rails tiene métodos para generar URL de parámetros, y me gustaría tener una funcionalidad similar, es decir, me gustaría tener una función url-for que podría llamar así:

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

Es Hay un marco web de Clojure que hace esto fácil? Si no, ¿cuáles son sus pensamientos sobre cómo esto podría implementarse?

Respuesta

4

Noir proporciona something similar. Incluso se llama url-for.

+0

¡Bonito! He mirado a Noir varias veces, pero hasta ahora realmente me ha gustado el enfoque más minimalista de Moustache. Voy a hacer un pequeño experimento hoy para ver si Noir se adapta a mis necesidades. – Gert

2

La función de ejemplo que ha mencionado podría implementarse de la siguiente manera. Pero no estoy seguro si esto es exactamente lo que estás buscando.

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

Gracias, pero esto sería básicamente lo mismo que codificar la url, ya que esta función simplemente traducirá: job en "/ job /". – Gert

Cuestiones relacionadas