【问题标题】:How can I preprocess data before displaying it in Luminus/Compojure?如何在 Luminus/Compojure 中显示数据之前对其进行预处理?
【发布时间】:2016-10-04 05:21:52
【问题描述】:

我在 Luminus/Compojure 项目中有这个:

(defn article-show-single [id]
  (let [a (db/get-single-article {:id id})]
  (layout/render "show.html"
    {:article a}))

现在我想预处理一篇文章的:body。我可以这样做:

(str/replace (:body a) #"regex123"
           (fn [[_ var1 var2]]
               (str "new str 123")))
; => new str 123

但是如何将这2个结合起来,即我想改变一篇文章的:body,仍然返回文章。我该怎么做?

【问题讨论】:

    标签: clojure compojure luminus


    【解决方案1】:

    作为第一步,我会将您的预处理代码提取为一个函数,以使代码更具可读性:

    (defn preprocess [s]
      (str/replace s
                   #"regex123"
                   (fn [[_ var1 var2]]
                     (str "new str 123"))))
    

    然后我将使用update 函数通过将提供的函数应用于当前值并在新版本的地图中使用该值来更新地图键的值:

    (update article :body preprocess)
    

    【讨论】:

    • Unable to resolve symbol: preprocess in this context
    • 当我将函数移到article-show-single之前,我得到Unable to resolve symbol: article in this context变量的名称是article,它存在。
    • update 中使用之前,您是否从我的答案中定义了preprocess 函数?
    • 这是我这边的一个错字。现在它正在工作。顺便说一句,我可以将多个参数从我的 main 函数传递给 preprocess 吗?
    • @Dimon,[基于您之前的问题:]您是否尝试过阅读文档,而只是从 SO 中复制粘贴答案?在编程时阅读它们是必不可少的。在这种情况下,您可以使用更多参数(defn preprocess [s val1 val2] ...) 定义您的preprocess 函数,然后使用update 传递参数:(update article :body preprocess "aaa" "bbb")。这两个最后的值将作为第二个和第三个参数分别传递给preprocess(而第一个参数将是更新字段的旧值)
    猜你喜欢
    • 2013-04-20
    • 2014-10-10
    • 2018-09-09
    • 2018-06-23
    • 2020-08-06
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    相关资源
    最近更新 更多