如何在没有布局的情况下呈现控制器动作?

Posted

技术标签:

【中文标题】如何在没有布局的情况下呈现控制器动作?【英文标题】:How do I render a controller action without a layout? 【发布时间】:2016-09-15 04:36:01 【问题描述】:

我有一个特定的控制器操作,我想在没有任何布局的情况下进行渲染。

我尝试在控制器级别不使用插件进行渲染,但没有成功。

defmodule Hello.PageController do
  use Hello.Web, :controller

  plug :put_layout, nil

  def landing(conn, _params) do
    render conn, "landing.html"
  end
end

我该怎么做?

【问题讨论】:

【参考方案1】:

plug :put_layout, nil 不起作用的原因是因为the put_layout plug only considers false to mean "don't use any layout"。 nil 被视为与任何其他原子一样,Phoenix 尝试渲染 nil.html

无法为 MyApp.LayoutView 呈现“nil.html”,请为 render/2 定义匹配子句或在“web/templates/layout”处定义模板。编译了以下模板:

app.html

解决方法是使用false:

plug :put_layout, false

如果你想限制插件执行某些操作,可以通过when

plug :put_layout, false when action in [:index, :show]

【讨论】:

【参考方案2】:

您只需要调用put_layout 并将conn 和false 传递给它。

def landing(conn, _params) do
  conn = put_layout conn, false
  render conn, "landing.html"
end

【讨论】:

【参考方案3】:

如果您正在运行 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)

【讨论】:

以上是关于如何在没有布局的情况下呈现控制器动作?的主要内容,如果未能解决你的问题,请参考以下文章

特定操作的渲染布局

如何在不在 grails 中生成视图的情况下调用动作 [关闭]

如何在 3D 触摸窥视动作的预览动作中访问呈现视图控制器?

Rails & Devise:如何在没有布局的情况下呈现登录页面?

如何在不隐藏 tabBar 的情况下呈现视图控制器

如何在没有 Storyboard 的情况下推送新视图 Swift