Простой способ получить доступ к карте запросов в каждом шаблоне продавца?

Я хочу получить доступ к URL текущей страницы в моих шаблонах Selmer, чтобы я мог передать его действию редактирования страницы, чтобы эта страница могла содержать ссылку на страницу вызова, даже после редактирования.

Вот код шаблона в моем шаблоне Selmer - кажется, все в порядке:

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

Вот как я устанавливаю значение back при поиске:

(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))

Это работает хорошо. Однако у меня есть другие методы, которые возвращают списки фотографий, и кажется, что нарушает принцип СУХОГО, чтобы добавить этот код ко всем другим методам.

Есть ли более простой способ сделать это, возможно, с помощью некоторого промежуточного программного обеспечения?

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))))

(По какой-то причине мне действительно нравится использовать макросы потоков в маршрутах, хотя, возможно, их ссылок в потоке недостаточно, чтобы оправдать это...)

Другие вопросы по тегам