0

我想访问我的 Selmer 模板中的当前页面 URL,以便我可以将其传递给编辑页面操作,这样即使在编辑之后,该页面也可以包含返回“调用”页面的链接。

这是我的 Selmer 模板中的模板代码——这看起来不错:

<a href="/photos/_edit/{{p.path}}{% if back %}?back={{back}}{% endif %}"
       class="btn btn-warning btn-sm">edit</a>

以下是我在搜索时设置返回值的方式:

(defn photo-search [word req] (layout/render "search.html" {:word word :photos (db/photos-with-keyword-starting word) :back (str (:uri req) "?" (:query-string req)) })) ;; ... (defroutes home-routes ;; ... (GET "/photos/_search" [word :as req] (photo-search word req))

这工作正常。但是,我还有其他返回照片列表的方法,并且将此代码添加到所有其他方法似乎违反了 DRY 原则。

有没有更简单的方法可以做到这一点,也许使用一些中间件?

4

1 回答 1

1

您可以尝试的一种方法是创建自己的render函数来包装 selmer 并在每个页面上提供您想要的通用功能。就像是:

(defn render
  [template request data]
  (let [back (str (:uri req) "?" (:query-string req))]
    (layout/render template (assoc data :back back))))

(defroutes home-routes
  (GET "/photos/" [:as req]
    (->> {:photos (db/recent-photos)}
         (render "list.html" req)))

  (GET "/photos/_search" [word :as req]
    (->> {:word   word
          :photos (db/photos-with-keyword-starting word)}
         (render "search.html" req))))

(出于某种原因,我真的很喜欢在路由中使用线程宏,即使它们在线程中可能没有足够的链接来证明它的合理性......)

于 2017-04-22T23:41:27.250 回答