2011-05-17 176 views
14

我在得到的形式參數在下面的Compojure示例問題:缺失形式參數

(ns hello-world 
    (:use compojure.core, ring.adapter.jetty) 
    (:require [compojure.route :as route])) 

(defn view-form [] 
(str "<html><head></head><body>" 
    "<form method=\"post\">" 
    "Title <input type=\"text\" name=\"title\"/>" 
    "<input type=\"submit\"/>" 
    "</form></body></html>")) 

(defroutes main-routes 
    (GET "/" [] "Hello World") 
    (GET "/new" [] (view-form)) 
    (POST "/new" {params :params} (prn "params:" params)) 
    (route/not-found "Not Found")) 

(run-jetty main-routes {:port 8088}) 

當提交表格的輸出總是

params: {} 

和我可以不知道爲什麼title參數不在params地圖中。

我正在使用Compojure 0.6.2。

回答

14

你有沒有考慮到這一點:

隨着0.6.0版本的Compojure不再添加默認中間件路線。這意味着你必須明確地將wrap-params和wrap-cookies中間件添加到你的路由中。

來源:https://github.com/weavejester/compojure

我想你的榜樣與我的當前設置和它的工作。我已經包括以下內容:require [compojure.handler :as handler](handler/api routes)

+1

'compojure.handler'已棄用。改爲使用'ring.middleware.params'。 – 2015-12-23 09:32:01

+0

正確,並且這個答案給出了一個適用於我的示例:http://stackoverflow.com/a/8199332/3884713 – 2016-03-29 18:05:13

0

你可以給出一個參數列表; compojure會自動將它們從POST/GET params中取出。如果你需要做更復雜的事情,但我從未研究過如何。例如,下面是從一個代碼段用於4clojure

(POST "/problems/submit" [title tags description code] 
    (create-problem title tags description code)) 
+2

我也試過這種方式,但我只得到零參數。 – cretzel 2011-05-17 20:50:22

15

這是如何處理參數

(ns example2 
    (:use [ring.adapter.jetty    :only [run-jetty]] 
    [compojure.core     :only [defroutes GET POST]] 
    [ring.middleware.params   :only [wrap-params]])) 

(defroutes routes 
    (POST "/" [name] (str "Thanks " name)) 
    (GET "/" [] "<form method='post' action='/'> What's your name? <input type='text' name='name' /><input type='submit' /></form>")) 

(def app (wrap-params routes)) 

(run-jetty app {:port 8080}) 

https://github.com/heow/compojure-cookies-example

一個很好的例子,見例2下 - 中間件功能