From d6dc893052ff0ba92809d3488b0bd3fa3456d139 Mon Sep 17 00:00:00 2001 From: matthewmcgarvey Date: Wed, 23 Feb 2022 17:36:28 -0600 Subject: [PATCH] Fix content rendering --- spec/view_spec.cr | 12 +++++++++++- src/kemal/helpers/macros.cr | 20 ++++++++------------ 2 files changed, 19 insertions(+), 13 deletions(-) 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.