2012-02-24 52 views

回答

4

首先,你可以使id的URI的一部分,這似乎不錯,安謐,將允許您使用路由語法強加的條件:

(GET ["/books/:id" :id #"[0-9]+"] [] ...) 

如果你更喜歡使用參數,像

(if-not id 
    (ring.util.response/not-found body-for-404) 
    ...) 

應該在未來的版本環工作,雖然這個特別的功能尚未發佈(這只是返回{:status 404 :headers {} :body the-body}雖然)。

此外,

(when id 
    ...) 

將導致路線匹配失敗的等效和剩餘路由將被嘗試;那麼你可以使用

(compojure.route/not-found body-for-404) 

作爲總是匹配的最終路線。

最後,如果你想申請過濾一大羣的Compojure處理的,您不妨將它們合併成的Compojure的defroutesroutes單處理器(後者是一個函數),並在中間件的包裝他們:

(defn wrap-404 [handler] 
    (fn wrap-404 [request] 
    (when (-> request :params :id) 
     (handler request)))) 

然後,您可以包括包裹處理程序,routes/defroutes形式的條目。

+0

有沒有辦法自動做到這一點(例如,與組成宏的參數)?討厭爲所有路線做。 – 2012-02-24 09:06:25

+0

我已經編輯了一些乾的東西了。我自己會使用基於URI的方法。對Compojure的DSL中params地圖的實際內容施加條件沒有神奇的語法。 – 2012-02-24 09:49:22

相關問題