Как бы я реализовал функциональность, подобную url_for Rails с Clojure и его веб-фреймворками? - PullRequest
5 голосов
/ 13 марта 2012

Я разрабатываю веб-приложение с Clojure, в настоящее время с Ring , Усы , Sandbar и Hiccup . У меня есть ресурс с именем 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, потому что она повторяет то, что я определил в маршруте усов; если я изменяю маршрут, мне нужно сменить контроллер, который крепче, чем мне нужно.

Я знаю, что в системе маршрутизации Rails есть методы для генерации URL-адресов из параметров, и мне бы хотелось, чтобы у меня была похожая функциональность, т. Е. Хотелось бы, чтобы у меня была функция url-for, которую я мог бы вызывать так:

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

Существует ли веб-инфраструктура Clojure, которая делает это простым? Если нет, что вы думаете о том, как это может быть реализовано?

Ответы [ 2 ]

4 голосов
/ 13 марта 2012

Noir предоставляет нечто подобное . Это даже называется url-for.

2 голосов
/ 13 марта 2012

Пример функции, которую вы упомянули, может быть реализован, как показано ниже. Но я не уверен, что это именно то, что вы ищете.

(defn url-for [& rest]
    (reduce 
        #(str %1 "/" %2) "" (map #(if (keyword? %1) (name %1) (str %1)) rest)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...