我一直在一個web項目中使用noir,並且根據他們的訪問級別(以及sublevel)來定義由defpage宏定義的所有可能的路由,我想到了限制對用戶的訪問。所以,我原本在Clojure中,是否有一種在宏定義中解構地圖的習慣方式?
(defpage [:post "/mysite"] {:as input}
(if-not (has-reqd-user-level? :levelX :sublevelY "/grantedRoute")
(noir.response/redirect "/insufficientRights")
...))
然後,我想這將擺脫樣板代碼:
(defmacro defpage-with-user-level [level sublevel granted-route route data expr]
`(defpage ~route ~data
(if-not (has-reqd-user-level? ~level ~sublevel ~granted-route)
(noir.response/redirect "/insufficientRights")
~expr)))
最後,我們使用它,如下所示:
(defpage-with-user-level :levelX :sublevelY "/grantedRoute"
[:post "/mysite"] {:as input}
(html
[:body [:h1 (str "Hello " (:name input) "!")]]))
但在本提到由Rich Hickey發佈的帖子,https://groups.google.com/forum/#!msg/clojure/4II-HKr_Pu0/2IcKit99cagJ,由於位置綁定感覺有點尷尬,這在已經存在地圖時不是慣用的。但是,我一直在尋找一些關於在宏中使用解構綁定的例子或討論,可悲的是,我沒有發現它們有任何明確的用法,因爲它的未經評估的表達式一直在被傳遞。
因此,下面的解決方案來到我的腦海:
(defmacro defpage-with-user-level [dts expr]
`(defpage (:route ~dts) (:data ~dts)
(if-not (has-reqd-user-level? (:level ~dts) (:sublevel ~dts) (:granted-route ~dts))
(noir.response/redirect "/insufficientRights")
~expr)))
但現在,目前還不清楚如何從映射當地人的數據映射傳遞:獲取和張貼到本地,如上面的例子。
我是否正確地離開我的第一次嘗試untampered或我真的需要使用第二種方法?我希望不是。有沒有其他的選擇?請告訴我。
非常感謝您!這正是我想知道的。那麼,我應該堅持你提出的解決方案,還是應該使用我的第一次嘗試?基本上,我們將頁面數據作爲地圖加入,就像您在裏克的帖子中提到的那樣,所以我認爲您的更正確。 – 2013-03-16 16:17:23
順便說一句,這傢伙是富里克里克;) – Ankur 2013-03-16 16:26:47
巨大的呃!對不起......謝謝。 – 2013-03-16 16:51:06