0

私はNoirと一緒にWebアプリケーションに取り組んでいます。ただし、ルーティングで問題が発生しています。これが私のコントローラーからのコードサンプルです:

(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

4

2 に答える 2

1

webnoir.orgのルートチュートリアルと比較すると、コードに少し違いがあります。

あなたの:

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

webnoirについて

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

しかし、おそらくそれは最終的には違いはありません...

于 2012-10-02T07:54:46.293 に答える
1

ソースコードノアールで判断すると、すべてのルートがマップに配置されるため、ディスパッチの順序を保証する方法はありません。

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)))

ルートが16未​​満の場合、noirはPersistentArrayMapを使用し、順序は保持されますが、この境界を越えるとすぐにルーティングが機能しなくなります。私の唯一のアドバイスは、明確なURLを使用することです。

編集:これは同様の問題に関するバグレポートです。

于 2012-10-02T07:55:02.290 に答える