diff --git a/spec/view_spec.cr b/spec/view_spec.cr
index 4705233..2a60574 100644
--- a/spec/view_spec.cr
+++ b/spec/view_spec.cr
@@ -22,7 +22,7 @@ describe "Views" do
end
request = HTTP::Request.new("GET", "/view/world")
client_response = call_request_on_app(request)
- client_response.body.should contain("Hello world")
+ client_response.body.strip.should eq("Hello world\n")
end
it "renders layout" do
@@ -59,4 +59,14 @@ describe "Views" do
client_response.body.should contain("Hello world")
client_response.body.should contain("
Hello from otherside
")
end
+
+ it "does not render content_for that was not yielded" do
+ get "/view/:name" do |env|
+ name = env.params.url["name"]
+ render "#{__DIR__}/asset/hello_with_content_for.ecr", "#{__DIR__}/asset/layout.ecr"
+ end
+ request = HTTP::Request.new("GET", "/view/world")
+ client_response = call_request_on_app(request)
+ client_response.body.should_not contain("Hello from otherside
")
+ end
end
diff --git a/src/kemal/helpers/macros.cr b/src/kemal/helpers/macros.cr
index 41c8793..84982ff 100644
--- a/src/kemal/helpers/macros.cr
+++ b/src/kemal/helpers/macros.cr
@@ -1,4 +1,4 @@
-CONTENT_FOR_BLOCKS = Hash(String, Tuple(String, Proc(String))).new
+CONTENT_FOR_BLOCKS = Hash(String, Tuple(String, Proc(Nil))).new
# `content_for` is a set of helpers that allows you to capture
# blocks inside views to be rendered later during the request. The most
@@ -34,13 +34,7 @@ CONTENT_FOR_BLOCKS = Hash(String, Tuple(String, Proc(String))).new
# layout, inside the tag, and each view can call `content_for`
# setting the appropriate set of tags that should be added to the layout.
macro content_for(key, file = __FILE__)
- %proc = ->() {
- __view_io__ = IO::Memory.new
- {{ yield }}
- __view_io__.to_s
- }
-
- CONTENT_FOR_BLOCKS[{{key}}] = Tuple.new {{file}}, %proc
+ CONTENT_FOR_BLOCKS[{{key}}] = Tuple.new {{file}}, ->() { {{ yield }} }
nil
end
@@ -60,10 +54,12 @@ end
# ```
macro render(filename, layout)
__content_filename__ = {{filename}}
- io = IO::Memory.new
- content = ECR.embed {{filename}}, io
- ECR.embed {{layout}}, io
- io.to_s
+ content_io = IO::Memory.new
+ ECR.embed {{filename}}, content_io
+ content = content_io.to_s
+ layout_io = IO::Memory.new
+ ECR.embed {{layout}}, layout_io
+ layout_io.to_s
end
# Render view with the given filename.