2012-10-01 130 views
0

我正在與Noir的Web應用程序工作。但是,我遇到路由問題。下面是我的控制器代碼示例:Clojure Noir路由優先級

(defpage [:get "https://stackoverflow.com/users/add"] [] 
    (common/layout 
     [:div.row 
     [:div.span12 
     [:div.page-header 
     [:h2 "Add User"]] 
     (form-to {:class "form-horizontal"} [:post "https://stackoverflow.com/users/add"] 
     (user-form {:id "" 
        :first_name "" 
        :last_name "" 
        :login "" 
        :email "" 
        :admin false 
        :staff false 
        :manager false 
        :customer false}) 
     [:div.control-group 
      [:div.controls 
      (submit-button {:class "btn btn-primary"} "Edit")]])]])) 


(defpage [:get "https://stackoverflow.com/users/:id" :id #"\d+"] {:keys [id]} 
(let [user (user/get-by-id id)] 
    (common/layout 
     [:div.row 
     [:div.span12 
     [:div.page-header 
     [:h2 "View User"]] 
     [:h3 (str (user :first_name) " " (user :last_name))] 
     [:dl.dl-horizontal 
     [:dt "login"] 
     [:dd (user :login)] 
     [:dt "e-mail"] 
     [:dd (user :email)] 
     [:dt "admin"] 
     [:dd (if (user :admin) [:i.icon-ok ""] [:i.icon-remove ""])] 
     [:dt "staff"] 
     [:dd (if (user :staff) [:i.icon-ok ""] [:i.icon-remove ""])] 
     [:dt "manager"] 
     [:dd (if (user :manager) [:i.icon-ok ""] [:i.icon-remove ""])] 
     [:dt "customer"] 
     [:dd (if (user :customer) [:i.icon-ok ""] [:i.icon-remove ""])]] 
     [:div.form-actions 
     [:a.btn.btn-primary {:href (str "https://stackoverflow.com/users/" (user :id) "/edit")} "Edit"] " " 
     [:a.btn.btn-danger {:href (str "https://stackoverflow.com/users/" (user :id) "/remove")} "Remove"] " " 
     [:a.btn {:href "/users"} "All users"]]]]))) 

每次我請求「/用戶/添加」,該請求被路由到「/用戶/:ID」(它是好的,當我刪除/用戶/添加動作)。我有另一個控制器非常類似的代碼,它工作正常。可能是什麼問題?如何設置路由優先級?

感謝, 亞切克

回答

1

我看到你的代碼比較路線教程webnoir.org差別不大。

此致:

(defpage [:get "https://stackoverflow.com/users/:id" :id #"\d+"] {:keys [id]} 

webnoir

(defpage [:get ["/user/:id" :id #"\d+"]] {:keys [id]} 
      ^     ^

但也許它並不能使到底區別...

1

source code輒看把每路線放入地圖中,因此無法保證調度的順序。

在noir.core:

(defonce noir-routes (atom {})) 
... 
(swap! noir-routes assoc ~(keyword fn-name) 
    (~action ~url {params# :params} (~fn-name params#))) 

在noir.server.handler後來:

(defn add-route-middleware [rts] 
    (let [ws (all-wrappers)] 
         ;Iterates over entries in a map, no particular order 
    (for [[route-name route] rts] 
     (try-wrap (ws route-name) route)))) 

(defn- pack-routes [] 
    (apply routes (concat (add-route-middleware @noir/pre-routes) 
         (add-route-middleware @noir/noir-routes) 
         (add-route-middleware @noir/post-routes) 
         @noir/compojure-routes))) 

我想如果你有less then 16 routes比諾使用PersistentArrayMap和排序被保留,但只要你越過這條邊界路線被打破。我唯一的建議是使用明確的網址。

編輯:這是一個bug report在類似的問題。

+1

作爲一種擴展,您可以爲它提供Compojure路由設置,雖然它們不像Noir的路由那麼獨立,但它們保持其排序。 – deterb

+0

Davidbe的回答使它成功,但我相信Noir可能存在問題。我的其他控制器中的路由沒有指定正則表達式,但按預期工作。 – Jacek

+0

@Jacek看看目前的實現我不會依賴它。 –