Skip to content

Commit

Permalink
Do not render root layout outside of layout formats
Browse files Browse the repository at this point in the history
  • Loading branch information
josevalim committed Jul 12, 2021
1 parent 4a27e93 commit ee5fa77
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 14 deletions.
25 changes: 11 additions & 14 deletions lib/phoenix/controller.ex
Original file line number Diff line number Diff line change
Expand Up @@ -772,18 +772,19 @@ defmodule Phoenix.Controller do
Map.get(conn.private, :phoenix_view) ||
raise "a view module was not specified, set one with put_view/2"

conn = prepare_assigns(conn, assigns, template, format)
data = render_with_layouts(conn, view, template, format)
layout_format? = format in layout_formats(conn)
conn = prepare_assigns(conn, assigns, template, format, layout_format?)
data = render_with_layouts(conn, view, template, format, layout_format?)

conn
|> ensure_resp_content_type(MIME.type(format))
|> send_resp(conn.status || 200, data)
end

defp render_with_layouts(conn, view, template, format) do
defp render_with_layouts(conn, view, template, format, layout_format?) do
render_assigns = Map.put(conn.assigns, :conn, conn)

case root_layout(conn) do
case layout_format? and root_layout(conn) do
{layout_mod, layout_tpl} ->
inner = Phoenix.View.render(view, template, render_assigns)
root_assigns = render_assigns |> Map.put(:inner_content, inner) |> Map.delete(:layout)
Expand All @@ -794,10 +795,10 @@ defmodule Phoenix.Controller do
end
end

defp prepare_assigns(conn, assigns, template, format) do
defp prepare_assigns(conn, assigns, template, format, layout_format?) do
assigns = to_map(assigns)
layout =
case layout(conn, assigns, format) do
case layout_format? and assigns_layout(conn, assigns) do
{mod, layout} -> {mod, template_name(layout, format)}
false -> false
end
Expand All @@ -811,14 +812,10 @@ defmodule Phoenix.Controller do
end)
end

defp layout(conn, assigns, format) do
if format in layout_formats(conn) do
case Map.fetch(assigns, :layout) do
{:ok, layout} -> layout
:error -> layout(conn)
end
else
false
defp assigns_layout(conn, assigns) do
case Map.fetch(assigns, :layout) do
{:ok, layout} -> layout
:error -> layout(conn)
end
end

Expand Down
13 changes: 13 additions & 0 deletions test/phoenix/controller/render_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,19 @@ defmodule Phoenix.Controller.RenderTest do
assert html_response?(conn)
end

test "renders string template without put_root_layout based on layout_formats" do
conn =
conn()
|> put_layout_formats(["not_html"])
|> put_layout({MyApp.LayoutView, "app.html"})
|> put_root_layout({MyApp.LayoutView, "root.html"})
|> render("index.html", title: "Hello")

refute conn.resp_body =~ "ROOTSTART"
refute conn.resp_body =~ "<html>"
assert html_response?(conn)
end

test "renders atom template with put layout" do
conn = put_format(layout_conn(), "html")
conn = render(conn, :index, title: "Hello")
Expand Down

0 comments on commit ee5fa77

Please sign in to comment.