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

时间:2016-09-15 04:36:02

标签: layout controller action 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

我该怎么做?

3 个答案:

答案 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)