2012-03-13 31 views
5

我正在開發使用Clojure的Web應用程序,目前正與RingMoustacheSandbarHiccup。我有一個名爲作業資源,以及路由,以顯示在多步的形式的特定步驟,用於這樣定義的特定作業(其他途徑爲簡單起見省略):我將如何實現類似於Clojure及其Web框架的Rails'url_for的功能?

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

在視圖我的控制器呈現時,鏈接指向同一作業中的其他步驟。目前,這些網址是用手構建的,例如, (str "/job/" id step)。我不喜歡硬編碼的"/job/" url部分,因爲它重複了我在鬍子路由中定義的內容;如果我改變路線,我需要改變我的控制器,這是一個比我更關心的緊密耦合。

我知道Rails的路由系統的方法來生成參數的URL,並且我希望我有類似的功能,也就是我希望我有一個功能url-for,我可以這樣調用:

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

是有一個Clojure網絡框架,使這很容易?如果不是的話,你對如何實施這個想法有什麼想法?

回答

4

諾爾提供something similar。它甚至被稱爲url-for

+0

不錯的一個!我曾多次看過Noir,但到目前爲止,我真的很喜歡更簡約的Mustache方法。我今天會做一個小實驗,看看Noir是否適合我的需求。 – Gert 2012-03-13 20:43:49

2

您提到的示例函數可以實現如下。但我不確定這是否正是您所需要的。

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

謝謝,但這基本上和硬編碼url相同,因爲這個函數只是將job轉換成「/ job /」。 – Gert 2012-03-13 20:41:09

相關問題