diff --git a/lib/phoenix/controller.ex b/lib/phoenix/controller.ex index 3d477fcde5..55dbe7effe 100644 --- a/lib/phoenix/controller.ex +++ b/lib/phoenix/controller.ex @@ -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) @@ -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 @@ -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 diff --git a/test/phoenix/controller/render_test.exs b/test/phoenix/controller/render_test.exs index b1c0d23e1c..d692c23562 100644 --- a/test/phoenix/controller/render_test.exs +++ b/test/phoenix/controller/render_test.exs @@ -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 =~ "" + 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")