首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Luminus中的复选框

Luminus中的复选框
EN

Stack Overflow用户
提问于 2017-10-10 02:50:23
回答 1查看 99关注 0票数 0

这周我开始学习Clojure,特别是我正在和Luminus一起学习web开发。因为我想了解CRUD过程,所以我设置了一个函数来将我的帖子保存到DB中:

代码语言:javascript
复制
(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"))))

该查询非常基本:

代码语言:javascript
复制
-- :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表单有一个复选框字段:

代码语言:javascript
复制
<input type="checkbox" name="active" value="1">Published<br />

如果未选中该字段,则不发送该字段,并且SQL insert查询将发送错误消息"No active field“。如何检查"active“元素是否已设置,并将其作为true或false添加到"params”?

类似于:

代码语言:javascript
复制
  (assoc params :active (if (nil? params/active) false true))  

在":created_at (java.util.Date.)“之后线路。

EN

回答 1

Stack Overflow用户

发布于 2017-10-10 04:19:52

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

看起来你的代码离工作不远了。您需要检查params映射,看看它是否具有复选框的值。如果选中复选框时(:active params)等于"1",则可以执行以下操作:

代码语言:javascript
复制
(assoc params :active (= "1" (:active params)))

但这实际上要做的是更新映射中的特定值,这可以更惯用地完成:

代码语言:javascript
复制
(update params :active #(= "1" %))

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

另一个潜在的问题是:您可能不想使用params映射作为DB查询的直接输入,因为它很容易包含您不想要或不期望的键/值。只从其中显式地提取您需要的值会更安全,例如(select-keys params [:title :body :active])

代码语言:javascript
复制
(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"}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46653140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档