Фрагмент фрагмента в шаблоне создает ленивую последовательность
Посещение localhost:3001/ результаты теста в следующем HTML:
<html>
<head>
</head>
<body>clojure.lang.LazySeq@27237276</body>
</html>
Код Clojure:
(ns notebook.handler
(:require [compojure.core :refer :all]
[compojure.handler :as handler]
[compojure.route :as route]
[net.cgrand.enlive-html :as html]))
(html/defsnippet welcome
(html/html [:h1]) ; html snippet
[:h1] ; selector
[username] ; arguments
[:h1] (html/content username)) ; substitution
(html/deftemplate home-page "templates/base.html"
[username]
[:body] (html/html-content (welcome username)))
(defroutes app-routes
(GET "/test" [] (home-page "oru"))
(route/resources "/")
(route/not-found "Not Found"))
(def app
(handler/site app-routes))
Похоже, я не правильно использую шаблоны и / или порчу лень где-то. Я пытался разместить doall
в нескольких местах, надеясь, что это разрешит лень, но не игра в кости.
Попытка отладки:
(welcome "oru")
=> ({:tag :h1, :attrs {}, :content ("oru")})
(html/emit* (welcome "oru"))
=> ("<" "h1" ">" "oru" "</" "h1" ">")
Все идет нормально...
(home-page "oru")
=> ("<" "html" ">" "\n " "<" "head" ">" "\n " "</" "head" ">" "\n " "<" "body" ">" "clojure.lang.LazySeq@27237276" "</" "body" ">" "\n\n" "</" "html" ">")
Бам! "clojure.lang.LazySeq@27237276"
Черт, это здесь делает?
1 ответ
Решение
Вы хотите использовать content
не html-content
, поскольку фрагменты производят последовательность узлов. html-content
ожидает строку буквального содержимого HTML и, вероятно, просто вызывает str
на его аргумент (в этом случае ленивая последовательность, которая является выводом вашего фрагмента).