まず、あなたはid
いいとRESTfulなようだと、あなたの条件を課すためにルート構文を使用できるようになるURIの一部を、作ることができますこの特定の関数は(それは単にしかし{:status 404 :headers {} :body the-body}
を返す)まだリリースされていないものの、パラメータ、
(if-not id
(ring.util.response/not-found body-for-404)
...)
のようなものは、次のリングバージョンで動作するはずです。
また、
(when id
...)
は、ルート一致障害の等価をもたらすであろうし、残りの経路が試みられるであろう。常に一致する最終ルートとして
(compojure.route/not-found body-for-404)
を使用できます。あなたはCompojureハンドラの大規模なグループにフィルタリングを適用したい場合
最後に、あなたがCompojureのdefroutes
またはroutes
を持つ単一のハンドラにそれらを結合することを望むかもしれない(後者は関数である)およびミドルウェアの部分でそれらを包みます:
(defn wrap-404 [handler]
(fn wrap-404 [request]
(when (-> request :params :id)
(handler request))))
あなたはその後、routes
/defroutes
フォームのエントリとしてラップハンドラを含めることができます。
自動的に行う方法はありませんか(たとえば、コンポジットマクロのパラメータを使用して)?すべてのルートでそれをするのは嫌いです。 –
私は物事を乾燥させるいくつかの方法で答えを編集しました。私は自分自身でURIベースのアプローチに行きます。 CompojureのDSLでparamsマップの実際の内容に条件を課す魔法の構文はありません。 –