【问题标题】:How would I implement functionality similar to Rails' url_for with Clojure and its web frameworks?我将如何使用 Clojure 及其 Web 框架实现类似于 Rails 的 url_for 的功能?
【发布时间】:2012-03-13 06:57:03
【问题描述】:

我正在使用 Clojure 开发一个 Web 应用程序,目前使用的是 RingMoustacheSandbarHiccup。我有一个名为 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/" 部分,因为它重复了我在 mustache 路由中定义的内容;如果我改变路线,我需要改变我的控制器,这是一个比我关心的更紧密的耦合。

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

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

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

【问题讨论】:

    标签: clojure url-routing ring


    【解决方案1】:

    Noir 提供something similar。它甚至被称为url-for

    【讨论】:

    • 不错的一个!我看过 Noir 很多次,但到目前为止,我真的很喜欢 Moustache 更简约的方法。今天我会做一个小实验,看看 Noir 是否适合我的需求。
    【解决方案2】:

    您提到的示例函数可以实现如下。但我不确定这是否正是您要寻找的。​​p>

    (defn url-for [& rest]
        (reduce 
            #(str %1 "/" %2) "" (map #(if (keyword? %1) (name %1) (str %1)) rest)))
    

    【讨论】:

    • 谢谢,但这本质上与对 url 进行硬编码相同,因为此函数只会将 :job 转换为“/job/”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多