首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure Noir路由优先级

Clojure Noir路由优先级
EN

Stack Overflow用户
提问于 2012-10-02 05:24:57
回答 2查看 189关注 0票数 0

我正在使用Noir开发一个web应用程序。但是,我遇到了路由问题。下面是我的控制器中的代码示例:

代码语言:javascript
复制
(defpage [:get "/users/add"] []
    (common/layout
      [:div.row
       [:div.span12
        [:div.page-header
         [:h2 "Add User"]]
        (form-to {:class "form-horizontal"} [:post "/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 "/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 "/users/" (user :id) "/edit")} "Edit"] " "
         [:a.btn.btn-danger {:href (str "/users/" (user :id) "/remove")} "Remove"] " "
         [:a.btn {:href "/users"} "All users"]]]])))

每次我请求"/users/add“时,请求都会被路由到"/user/:id”(当我删除/user/add操作时,这是正常的)。我为另一个控制器编写了非常类似的代码,它工作得很好。可能的问题是什么?如何设置路由优先级?

谢谢,Jacek

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-02 15:54:46

我发现你的代码和webnoir.org上的routes tutorial有一点不同。

你的:

代码语言:javascript
复制
(defpage [:get "/users/:id" :id #"\d+"] {:keys [id]}

webnoir

代码语言:javascript
复制
(defpage [:get ["/user/:id" :id #"\d+"]] {:keys [id]}
               ^                      ^ 

但也许最终这并没有什么不同。

票数 1
EN

Stack Overflow用户

发布于 2012-10-02 15:55:02

通过source code判断,noir将每条路线都放入一个map中,因此无法保证调度的有序性。

在noir.core中:

代码语言:javascript
复制
(defonce noir-routes (atom {}))
...
(swap! noir-routes assoc ~(keyword fn-name) 
     (~action ~url {params# :params} (~fn-name params#)))

稍后在noir.server.handler中:

代码语言:javascript
复制
(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,noir会使用PersistentArrayMap,并且顺序是保留的,但是一旦你越过这个边界,路由就被打破了。我唯一的建议是使用明确的URL。

编辑:这里有一个类似问题的bug report

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12681337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档