麻烦让defroutes在webnoir中工作

时间:2012-09-02 18:03:34

标签: model-view-controller web-applications clojure compojure noir

所以,我是一个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',我甚至不确定从哪里开始。我能够将该网站与defpage一起使用,但随着路线数量的增加,它看起来很丑陋而且无法扩展。

所以

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

2 个答案:

答案 0 :(得分:1)

也许您会发现此页面有用Global Noir Routes(允许在一个位置定义路由的defpage宏变体的实现。)

答案 1 :(得分:1)

在Noir中,如果你想将它们全部放在同一个地方,你可以将所有的defpage放在同一个命名空间中。它们可以像委托其他函数一样简单地完成“实际”工作,就像您在示例中定义(GET“/”...)路径一样。

  

我在这里做错了什么?对底层compojure / clojure / ring层的任何了解都很棒

不确定你做错了什么,你的代码对我来说只有一些微小的变化:

在加载文件时添加ring.adapter.jetty以启动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