1

所以,我是一个 clojure n00b,当我试图为我正在构建的项目获取路线时,我错过了一些东西。

我在循环依赖方面遇到了一些问题,在使用 Django 之后,我认为将路由全部定义在一个地方要好得多,而不是像使用defpage.

上代码:

这是我的core.clj文件:

(ns blktechies-home.core
  (:use compojure.core
        hiccup.middleware)
  (:require [compojure.route :as route]
            [blktechies-home.routes :as site-routes]
            [compojure.handler :as handler]
            [compojure.response :as response]))

(def app
  (-> (handler/site site-routes/app)
      (wrap-base-url)))

然后在我的路线文件中,我有以下内容:

(ns blktechies-home.routes
  (:use compojure.core
        noir.core
        hiccup.middleware)
  (:require [compojure.route :as route]
            [compojure.handler :as handler]
            [compojure.response :as response]
            [blktechies-home.views.common :as common]))

(defroutes app
  (GET "/" [] (common/main-layout
               (welcome/index-page)))
  (route/resources "/")
  (route/not-found "<h1>NOPE</h1>"))

一切都是404'ing,我什至不知道从这里去哪里。我可以使用该站点defpage,但随着路由数量的增加,它看起来很丑陋且不可扩展。

所以

  • 我在这里做错了什么?对底层组合/clojure/ring 层的任何洞察都会很棒
  • 如果这不是定义路线的最佳方式,那是什么?
  • github上有大型clj-noir网站的好例子吗?(我的 google-fu 让我失望了。)
4

2 回答 2

1

也许您会发现此页面对Global Noir Routes很有帮助(实现了一个defpage允许在一个地方定义路线的宏变体)。

于 2012-09-03T08:07:08.337 回答
1

在 Noir 中,您可以将所有 defpage 放在同一个命名空间中,如果您想将它们全部放在同一个位置,则可以一个接一个。它们可以像委派给其他函数来完成“真正的”工作一样简单,就像您在示例中定义 (GET "/" ...) 路由的方式一样。

我在这里做错了什么?对底层组合/clojure/ring 层的任何洞察都会很棒

不知道你做错了什么,你的代码对我有用,只需进行一些最小的更改:

加载文件时只需添加 ring.adapter.jetty 即可启动码头服务器的核心:

 (ns blktechies-home.core
  (:use compojure.core
        hiccup.middleware
        [ring.adapter.jetty :only [run-jetty]])
  (:require [compojure.route :as route]
            [blktechies-home.routes :as site-routes]
            [compojure.handler :as handler]
            [compojure.response :as response]))

(def app
  (-> (handler/site site-routes/app)
    (wrap-base-url)))

(run-jetty app {:port 8080 :join? false})

您的路线文件,没有“views.common”命名空间:

 (ns blktechies-home.routes
  (:use compojure.core
        noir.core
        hiccup.middleware)
  (:require [compojure.route :as route]
            [compojure.handler :as handler]
            [compojure.response :as response]))

 (defroutes app
   (GET "/" [] "the root path")
   (route/resources "/")
   (route/not-found "<h1>NOPE</h1>"))

现在开始repl:

lein repl

并加载核心:

user=> (load-file "src/blktechies_home/core.clj")
#<Server Server@9ae1ab>

并获得根:

wget http://localhost:8080/ -O - -q
the root path
于 2012-09-04T00:27:30.633 回答