2012-10-01 84 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看看目前的实现我不会依赖它。 –