2017-10-09 58 views
0

我本周开始学习Clojure的,特别是我学习web开发与Luminus公司。因为我想了解CRUD过程中,我设置的功能,我的文章保存到DB:复选框在Luminus公司

(defn save-post! [{:keys [params]}] 
    (if-let [errors (validate-post params)] 
    (-> (response/found "/posts") 
     (assoc :flash (assoc params :errors errors))) 
    (do 
    (db/save-post! 
     (assoc params :created_at (java.util.Date.))) 
    (response/found "/posts")))) 

查询是非常基本的:

-- :name save-post! :! :n 
-- :doc creates a new post record 
INSERT INTO posts 
(title, body, active, created_at) 
VALUES (:title, :body, :active, :created_at) 

但HTML形式都有一个复选框领域:

<input type="checkbox" name="active" value="1">Published<br /> 

并且当没有选择,该字段不发送和SQL插入查询发送错误消息“无活性字段”。我如何检查元素“active”是否已设置,并将它添加到“params”为true或false?

是这样的:

(assoc params :active (if (nil? params/active) false true)) 

后 “:created_at(java.util.Date)” 行。

回答

2

如何检查元素“active”是否已设置,并将它添加到“params”为true或false?

看起来像你的代码是不远处的工作。您需要检查params地图,看看它是否具有复选框的值。如果在复选框被选中(:active params)等于"1",那么你可能会做这样的事情:

(assoc params :active (= "1" (:active params))) 

但是这确实在努力做的是更新在地图上某一特定值,这是可以做到更通俗地说:

(update params :active #(= "1" %)) 

其中最后一个参数是一个函数,该函数接受关键字的任何当前值并返回新值。

另一个潜在的疑难杂症:你可能不希望使用params地图为直接输入到您的数据库查询,因为它可以很容易地包含键/你不希望或者期待值。只显示你需要的值是比较安全的。 (select-keys params [:title :body :active])

(def params {:active "1", :admin true}) ;; wouldn't want admin to leak through! 
(-> params 
    (select-keys [:title :body :active]) 
    (assoc :created_at (java.util.Date.)) 
    (update :active #(= "1" %))) 
;;=> {:active true, :created_at #inst "2017-10-09T20:16:06.167-00:00"}