2013-03-20 49 views
0

我正在嘗試在webnoir中執行此操作。如何在webnoir中使用此工作

這工作:

(defpage [:post "/testurl] {:keys [name phone]} 
    (html5 
    (str "name: " name) 
    (str "phone: " phone))) 

現在我想產生許多模塊defpages,每個人都有不同的字段列表。我想從函數中調用defpages。 defpage必須接受郵政領域。

基本上我有這樣的:(def fields1 ["Name" "Phone" "Email" "xyz"])

我想通過這對defpage,而不必手動指定的密鑰。

這些字段可能會在將來發生變化,這就是爲什麼我希望我的代碼能夠在服務器啓動時動態獲取字段並創建defpages。

可能嗎?

謝謝你的幫助!

回答

0

你可以用宏做:

(defmacro defpages [pages] 
    `(do 
    [email protected](map (fn [page] 
       `(~'defpage [:post ~(str "/" (page :name))] 
       {:keys ~(into [] (map symbol (page :fields)))} 
       (~'html5 
        [email protected](map (fn [field] 
          `(str ~(str field ": ") 
           ~(symbol field))) 
         (page :fields))))) pages))) 



(defpages [{:name "testurl" 
      :fields ["name" "phone"]} 
      {:name "user" 
      :fields ["age" "address"]}]) 
+0

非常感謝你 - 你是天才! – user2011931 2013-03-21 10:54:46

+0

我還有一個問題。 這工作: (defmacro defp [領域] '(defpage [:交 「/ createcontacts」] {:鍵〜(進入[](地圖符號字段))} (添加到分貝[ 〜@(map(fn [field] '(str「field:」〜(str field「:」)〜(symbol field))) fields)] ))) 當我調用(defp [「name 「 「電話」])。但是,當我將代碼更改爲: (def fields1 [「name」「phone」]),然後調用(defp fields1)時,我收到:不知道如何從:clojure.lang創建ISeq。符號 有什麼可以在這裏錯了嗎? 再次感謝您! – user2011931 2013-03-21 13:33:48