Skip to content

Commit

Permalink
Fix content rendering
Browse files Browse the repository at this point in the history
  • Loading branch information
matthewmcgarvey authored and sdogruyol committed Feb 24, 2022
1 parent 59720fb commit d6dc893
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 13 deletions.
12 changes: 11 additions & 1 deletion spec/view_spec.cr
Expand Up @@ -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("<html>Hello world\n</html>")
end

it "renders layout" do
Expand Down Expand Up @@ -59,4 +59,14 @@ describe "Views" do
client_response.body.should contain("Hello world")
client_response.body.should contain("<h1>Hello from otherside</h1>")
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("<h1>Hello from otherside</h1>")
end
end
20 changes: 8 additions & 12 deletions 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
Expand Down Expand Up @@ -34,13 +34,7 @@ CONTENT_FOR_BLOCKS = Hash(String, Tuple(String, Proc(String))).new
# layout, inside the <head> 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

Expand All @@ -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.
Expand Down

0 comments on commit d6dc893

Please sign in to comment.