clojure - 黑巢路线

标签 clojure routes metaprogramming noir

我有一个应用程序,可以根据特定数据存储生成 key 。如果有 7 条这样的路线和 5 个应用程序,则我的 event.clj 中总共将有 35 条路线(或者,如果拆分,则为 5 个文件中的 7 个/文件)。我想动态地执行以下操作:

(defnested "/:app-name"
    (defpage "/generate/event" {:keys [app-name event-name time] :as key-map}
     (response/json
      {:key (key-model/build-key :event key-map)}))

    (defpage "/generate/event/unread" {:keys [app-name event-name] :as key-map}
     (response/json
      {:key (key-model/build-key :unread-for-event key-map)}))
)

这样我就可以编写每个路由一次,然后传递应用程序名称(而不是在查询参数中传递它,这可以工作,但不是很 RESTful。

奖金

如何动态调用命名空间,以便 key-model/build-key 成为对 redis-model/build-keyriak- 的调用model/build-key 基于应用程序名称?

最佳答案

不确定我是否理解这个问题,但这不是您正在寻找的:

(defpage "/:app-name/generate/event" {:keys [app-name event-name time] :as key-map}
    (response/json
      {:key (key-model/build-key :event key-map)}))

(defpage "/:app-name/generate/event/unread" {:keys [app-name event-name] :as key-map}
     (response/json
      {:key (key-model/build-key :unread-for-event key-map)}))

奖金

我还将寻求一个简单的解决方案,即使用带有函数的映射来生成 key ,例如:

(def key-gen {"redis" redis-model/build-key
       "riak" riak/build-key})

(response/json
      {:key ((get key-gen app-name) :event key-map)})

如果你确实想动态查找构建 key 函数,你可以这样做:

(defn build-key [app-name] 
   (let [the-ns (symbol (str app-name "-model"))] 
      (require the-ns) 
      (ns-resolve the-ns 'build-key)))

关于clojure - 黑巢路线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12629265/

相关文章:

caching - clojure.core.cache 只是使用他们自己的例子不起作用

node.js - 在 Express 上伪造 req.host 值

ruby-on-rails - 多态 Controller 和调用对象

c++ - 类型特征实验,SFINAE 似乎不起作用,提示缺少错误形式的某些东西

hadoop - 为什么 Spark 运行多个进程?

clojure - Clojure 中函数参数的求值顺序

php - Laravel 从 ROOT 外部调用/public 文件夹。获取 NotFoundHttpException

c++ - 模板元编程以精确匹配函数签名

c++ - 我可以检测在编译时使用了哪个标签分派(dispatch)重载吗?

clojure - leiningen 有多个主要类(class)