5

我正在使用 Clojure 开发一个 Web 应用程序,目前使用的是RingMustacheSandbarHiccup。我有一个名为job的资源,以及一个以多步骤形式显示特定步骤的路径,用于定义这样的特定作业(为简单起见,省略了其他路径):

(def web-app
  (moustache/app
   ;; matches things like "/job/32/foo/bar"
   :get [["job" id & step]
         (fn [req] (web.controllers.job/show-job id step))]))

在我的控制器呈现的视图中,有指向同一作业中其他步骤的链接。目前,这些 url 是手工构建的,例如(str "/job/" id step). 我不喜欢"/job/"url 的硬编码部分,因为它重复了我在 mustache 路由中定义的内容;如果我改变路线,我需要改变我的控制器,这是一个比我关心的更紧密的耦合。

我知道 Rails 的路由系统有从参数生成 url 的方法,我希望我有类似的功能,即我希望我有一个url-for可以这样调用的函数:

(url-for :job 32 "foo" "bar")
; => "/job/32/foo/bar"

有没有一个 Clojure Web 框架可以让这变得简单?如果没有,您对如何实现这一点有何想法?

4

2 回答 2

4

Noir 提供了类似的东西。它甚至被称为url-for.

于 2012-03-13T17:34:42.427 回答
2

The example function you have mentioned could be implemented as below. But I am not sure if this is exactly what you are looking for.

(defn url-for [& rest]
    (reduce 
        #(str %1 "/" %2) "" (map #(if (keyword? %1) (name %1) (str %1)) rest)))
于 2012-03-13T15:14:04.687 回答