Ser*_*pia 8 layout action controller elixir phoenix-framework
我有一个特定的控制器动作,我想要渲染没有任何布局.
我尝试在控制器级别没有插件的情况下渲染,但它没有用.
defmodule Hello.PageController do
use Hello.Web, :controller
plug :put_layout, nil
def landing(conn, _params) do
render conn, "landing.html"
end
end
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
Dog*_*ert 10
之所以plug :put_layout, nil
不起作用是因为该put_layout
插件只考虑false
表示"不使用任何布局".nil
处理就像任何其他原子一样,凤凰试图渲染nil.html
:
无法为MyApp.LayoutView呈现"nil.html",请为render/2定义匹配子句或在"web/templates/layout"中定义模板.编译了以下模板:
- app.html
修复是使用false
:
plug :put_layout, false
Run Code Online (Sandbox Code Playgroud)
如果要将插件限制为某些操作,可以传递when
:
plug :put_layout, false when action in [:index, :show]
Run Code Online (Sandbox Code Playgroud)
plug :put_root_layout, {MyAppWeb.LayoutView, :root}
如果您正在运行 LiveVeiw 应用程序,您的浏览器管道中可能会有一个。
在这种情况下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(...)
Run Code Online (Sandbox Code Playgroud)
或更短:
conn
|> put_root_layout(false)
|> render(..., layout: false)
Run Code Online (Sandbox Code Playgroud)
您只需要调用put_layout
conn和false并将其传递给它。
def landing(conn, _params) do
conn = put_layout conn, false
render conn, "landing.html"
end
Run Code Online (Sandbox Code Playgroud)