2016-03-27 2 views
0

Ich arbeite mit Compojure und stieß auf ein Problem mit dem Makro "defroutes". Mein Fehler wird dadurch verursacht, dass das Makro keine Funktion auswertet. Hier ist ein Beispiel für meine Routen und was ich versuche zu tun. Sterne hinzugefügt für die Betonung.Wie führe ich einen Datenbankeintrag basierend auf einem HTML-Formular in clojure aus?

(defroutes simple-routes 
    (GET "/", [], form) 
    ***(POST "/", [count, day], (do (create-entry count day) "Success!")*** 
    (GET "/attendance/", [], response) 
    (resources "/") 
    (not-found "404") 

create-entry korrekt funktioniert, wenn sie als solche (create-entry 1 2) Eingeben der zwei ganzen Zahlen in die Datenbank ausgewertet. Es wird jedoch nicht ausgeführt, wenn es im obigen Routenmakro platziert wird. Was kann ich tun, um die beiden Integer-Werte aus einem HTML-Formular-Post als (create-entry count day) zu erhalten? (Ja ich weiß, dass dieser Code nicht stand alone ist, aber der obige Code ist der einzige Code in Frage, wie alles andere gut läuft.)

Antwort

2

können Sie verwenden Compojure Bindung von form params zusammen mit params coercion:

(ns compojure-hello-world.handler 
    (:require [compojure.core :refer :all] 
      [compojure.route :as route] 
      [compojure.coercions :refer :all] 
      [ring.middleware.params :refer [wrap-params]])) 

(defroutes app-routes 
    (GET "/" [] "Hello World") 
    (POST "/" [count :<< as-int 
      day :<< as-int] 
       (println "Count" count (type count) "Day" day (type day))   
       (create-entry count day) 
       {:status 200 :body "Done"}) 
    (route/not-found "Not Found")) 

(def app 
    (-> app-routes (wrap-params))) 

Dann können Sie es testen:

curl -X POST --data "count=1&day=2" http://localhost:3000/ 
0

Es gibt sicherlich eine prägnantere Methode. Doch die Sterne-Zeile der folgenden ändern, und das Hinzufügen einer Funktion arbeitet:

(POST "/", [], entry) 

entry wird eine Karte der Form Post übergeben werden. Das Folgende ist eine atrocious Funktion entwickelt, um die Werte aus der Karte zu erhalten und sich an create-entry:

(defn entry [request] 
    (apply create-entry (reduce #(conj %1 (Integer/parseInt (get (get request :params) %2))) [] '(:count :day)))) 

Dies steht als Patch, bis jemand, der mit diesem seit mehr arbeiten, kann eine bessere Antwort geben.

Verwandte Themen