如何在webnoir中工作

时间:2013-03-20 15:13:36

标签: clojure noir

我试图在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。

有可能吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您可以使用宏来执行此操作:

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



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