2013-03-16 55 views
3

我一直在一個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或我真的需要使用第二種方法?我希望不是。有沒有其他的選擇?請告訴我。

回答

4

您的第一個解決方案很好。 Rich在談論的是使用普通的舊地圖來傳遞數據,而不是爲每種類型的數據創建新的類型/類。例如:您可以使用簡單的地圖重新顯示用戶信息,而不是創建用於表示用戶數據的類。

至於你的第二次嘗試而言,你可以使用地圖去結構中宏爲:

(defmacro defpage-with-user-level [{:keys [route data level sublevel granted-route]} expr] 
    `(defpage ~route ~data 
    (if-not (has-reqd-user-level? ~level ~sublevel ~granted-route) 
     (noir.response/redirect "/insufficientRights") 
     ~expr))) 

(defpage-with-user-level {:level :levelX 
          :sublevel :sublevelY 
          :granted-route "/grantedRoute" 
          :route [:post "/mysite"] 
          :data {:as input}} 
    (html 
    [:body [:h1 (str "Hello " (:name input) "!")]])) 
+0

非常感謝您!這正是我想知道的。那麼,我應該堅持你提出的解決方案,還是應該使用我的第一次嘗試?基本上,我們將頁面數據作爲地圖加入,就像您在裏克的帖子中提到的那樣,所以我認爲您的更正確。 – 2013-03-16 16:17:23

+0

順便說一句,這傢伙是富里克里克;) – Ankur 2013-03-16 16:26:47

+0

巨大的呃!對不起......謝謝。 – 2013-03-16 16:51:06

相關問題