2012-09-27 28 views
2

我有一個應用程序可以根據特定的數據存儲生成密鑰。如果有7個這樣的路線和5個應用程序,則我的event.clj中會有35條路線(或者,如果拆分爲7個/文件在5個文件中)。我想這樣做動態如下:Nest Noir路線

(defnested "/:app-name" 
    (defpage "/generate/event" {:keys [app-name event-name time] :as key-map} 
    (response/json 
     {:key (key-model/build-key :event key-map)})) 

    (defpage "/generate/event/unread" {:keys [app-name event-name] :as key-map} 
    (response/json 
     {:key (key-model/build-key :unread-for-event key-map)})) 
) 

這樣我可以寫一次,每條路線,然後繞過應用程序名稱(而不是通過它的查詢參數,它的作品,但不是很REST風格。

BONUS

我怎麼能動態調用一個命名空間,以便key-model/build-key變得redis-model/build-keyriak-model/build-key調用基於應用程序的名稱?

回答

2

不知道我理解的問題但是這不就是你的正在尋找:

(defpage "/:app-name/generate/event" {:keys [app-name event-name time] :as key-map} 
    (response/json 
     {:key (key-model/build-key :event key-map)})) 

(defpage "/:app-name/generate/event/unread" {:keys [app-name event-name] :as key-map} 
    (response/json 
     {:key (key-model/build-key :unread-for-event key-map)})) 

BONUS

我也會去具有與該funcitons地圖生成密鑰的一個簡單的解決方案,是這樣的:

(def key-gen {"redis" redis-model/build-key 
     "riak" riak/build-key}) 

(response/json 
     {:key ((get key-gen app-name) :event key-map)}) 

如果你真的想找到動態生成按鍵的功能,你可以這樣做:

(defn build-key [app-name] 
    (let [the-ns (symbol (str app-name "-model"))] 
     (require the-ns) 
     (ns-resolve the-ns 'build-key))) 
+0

是的,我可以做對於每個路由,但我正在尋找一個更好的方法調用解決方案(所以有人可以添加後端,而不必擔心將其添加到路由中的哈希映射)儘管使用get可以允許默認值返回404或422 – Chris

+0

更新的答案。如果'the-ns'或返回值爲零,你仍然可以返回404或422 – DanLebrero

+0

這只是我尋找的那種瘋狂;) – Chris