如何在 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/
我正在使用 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/