3

compojure.core/GET は、ルート定義パラメーターとして、URI 自体に加えて、URI から抽出されたパラメーターと一致する URI を記述する文字列または正規表現を記述するベクトルのいずれかを受け入れます。ここでドキュメントを見つけることができますRoutes in Detail

私のREPLから(ゼロから始めて、この質問の最後にあるleiningenのproject.clj)

user> (use '[compojure.core :only [GET]])
nil
user> (def h (GET "/" [] "hello"))
#'user/h
user> (h {:uri "/" :request-method :get})
{:status 200, :headers {"Content-Type" "text/html; charset=utf-8"}, :body "hello"}

これまでのところ、とても良い、プレーンなバニラルート

以下は、ルーティングにベクトルを使用する例です。

user> (def h2 (GET ["/foo/:id" :id #"[0-9]+"] [] "hello from foo"))
#'user/h2
user> (h2 {:uri "/foo/123" :request-method :get})
{:status 200, :headers {"Content-Type" "text/html; charset=utf-8"}, :body "hello from foo"}
user> (h2 {:uri "/foo/abc" :request-method :get})
nil

それでも大丈夫です。数値の :id のリクエストのみに一致することがわかります

今ここに私が理解できない部分があります:

user> (def v ["/foo/:id" :id #"[0-9]+"])
#'user/v
user> (def h3 (GET v [] "hello again from foo"))
#'user/h3
user> (h3 {:uri "/foo/abc" :request-method :get})
IllegalArgumentException No implementation of method: :route-matches of protocol: #'clout.core/Route found for class: clojure.lang.PersistentVector  clojure.core/-cache-protocol-fn (core_deftype.clj:541)

ハンドラがリテラル ベクトルではなく変数で定義されている場合、評価時にハンドラが失敗する理由を誰か説明できますか?

正確な環境を複製したい場合は、これが私の leiningen プロジェクト ファイル project.clj です。

(defproject cljlab "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.5.1"]
                 [org.clojure/clojure-contrib "1.2.0"]
                 [compojure "1.1.5"]])
4

1 に答える 1