如何在 clojure 中基于 html 表单 post 执行数据库条目?

How to execute a database entry based on a html form post in clojure?

我正在使用 Compojure 和 运行 解决宏 "defroutes" 的问题。我的错误是由于宏没有评估函数引起的。 这是我的路线示例以及我正在尝试做的事情。为强调而添加了星星。

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

create-entry 在这样计算时功能正确 (create-entry 1 2) 将两个整数输入数据库。但是当放在上面的路由宏中时它不会得到 运行 。我该怎么做才能将 html 形式 post 中的两个整数值变为 运行 和 (create-entry count day)? (是的,我知道这段代码不是独立的,但上面的代码是唯一有问题的代码,因为其他一切都很好 运行。)

肯定有更简洁的方法。然而,将带星号的行更改为以下内容并添加一个函数,是可行的:

(POST "/", [], entry) 

entry 将传递 post 形式的地图。以下是一个糟糕的函数,旨在从所述映射中获取值并将它们传递给 create-entry:

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

这只是一个补丁,直到使用它更长时间的人可以给出更好的答案。

您可以使用 form params along with params coercion:

的 Compojure 绑定
(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)))

那你可以测试一下:

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