2

2つの入力を受け取るハンドラー関数を作成したいと思います。1つはURLから取得したパラメータで、もう1つは/nameクエリ文字列から取得したパラメータです。/name?x=3

(def my-app (app
               [page-name] (handler page-name)))

(defn handler
  [{:keys [params]} page-name]
  (let [x (params "x")]
    (-> (page-templ page-name x) response constantly)))

ハンドラーが2つのパラメーターを期待しているため、上記は失敗しますが、私は1つしか渡していません。

リクエストマップを取得してハンドラーに渡すにはどうすればよいですか?

上記の場合のリクエストマップには、という名前のパラメータが含まれていxます。

4

1 に答える 1

1

次のように、ページ名でディスパッチできればベストです。

(app
 [""] (index-page)
 ["login"] (serve-login))

ここで、関数 index-page と serve-login は、1 つの引数の関数を返します。

(defn index-page[]
  (fn [req] ..))

req は、キー/値マップのすべての URL パラメータを含むリクエストです。パラメータ値を取得するには、次のようにします。

(-> req (get :params) (get :x))

したがって、完全なソリューションは次のようになります。

(def my-app (app
               ["page1-name"] (handler)))

(defn handler []
  (fn [req]
    (let [x (-> req :params :x)]
      (-> (page-templ page-name x) response))))

編集:アプリケーションを (wrap-keyword-params) と (wrap-params) にラップすることを忘れないでください。これを行う方法は次のとおりです。

(def my-wrapped-app
  (-> my-app
   (wrap-keyword-params)
   (wrap-params))
于 2012-09-11T11:27:47.470 に答える