Luminus中的复选框

时间:2017-10-09 18:50:23

标签: clojure luminus

本周我开始学习Clojure,特别是我正在学习Luminus的Web开发。由于我想了解CRUD过程,我设置了一个函数将我的帖子保存到DB中:

(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。)”行之后。

1 个答案:

答案 0 :(得分:2)

  

如何设置元素“有效”是否已设置并将其添加到“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"}