我有一个特殊的控制器动作,我想要渲染而没有任何布局。
我尝试在控制器级别没有插件的情况下进行渲染,但它没有用。
defmodule Hello.PageController do
use Hello.Web, :controller
plug :put_layout, nil
def landing(conn, _params) do
render conn, "landing.html"
end
end
我该怎么做?
答案 0 :(得分:9)
plug :put_layout, nil
不起作用的原因是因为the put_layout
plug only considers false
to mean "don't use any layout"。 nil
被视为与任何其他原子一样,凤凰试图渲染nil.html
:
无法渲染" nil.html"对于MyApp.LayoutView,请为render / 2定义匹配子句,或在" web / templates / layout"中定义模板。编译了以下模板:
- app.html
修复方法是使用false
:
plug :put_layout, false
如果您想将插件限制为某些操作,可以传递when
:
plug :put_layout, false when action in [:index, :show]
答案 1 :(得分:4)
您只需要调用put_layout
并将conn和false传递给它。
def landing(conn, _params) do
conn = put_layout conn, false
render conn, "landing.html"
end
答案 2 :(得分:0)
如果您运行的是 LiveVeiw 应用,则您的浏览器管道中可能会有一个 plug :put_root_layout, {MyAppWeb.LayoutView, :root}
。
在这种情况下,put_layout(false)
只会禁用应用布局,因此您必须使用 conn |> put_root_layout(false)
来禁用根布局。
您可能希望同时禁用两者,因此您需要:
conn
|> put_layout(false) # disable app.html.eex layout
|> put_root_layout(false) # disable root.html.eex layout
|> render(...)
或更短:
conn
|> put_root_layout(false)
|> render(..., layout: false)