如何在没有布局的情况下渲染控制器操作?

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)


Sbb*_*bbs 7

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)


Ser*_*pia 5

您只需要调用put_layoutconn和false并将其传递给它。

def landing(conn, _params) do
  conn = put_layout conn, false
  render conn, "landing.html"
end
Run Code Online (Sandbox Code Playgroud)