关闭布局以执行一项操作


81

我的情况:ReportsController的View动作应呈现纯HTML,而不是作为文件呈现(在浏览器中查看并在以后保存)。因此,对于渲染,我使用视图模板view.html.erb,并且我需要关闭此操作的所有布局。但是在此控制器的其他操作中,布局应保持不变。只能对整个控制器关闭,如下所示:

ReportsController < ApplicationController
  layout false

但这做错了:(对于所有动作,我试图在动作中使用类似以下的方式:

def view      
  @report = Report.new(params[:report])
  unless @report.valid?
    render :action => 'new' and return
  else
    render :layout => false     
  end   
end

我该怎么办?


好吧,您绝对不需要该明确的回报。如果报告有效,是否要显示布局?
tfwright 2010年

Answers:


73

试试这个:

ReportsController < ApplicationController
  layout false
  layout 'application', :except => :view

看来此指令工作不正确(或意外)。我尝试使用这些参数的一些组合(:only,:except)。但是这样做很奇怪,删除了所有动作的所有布局。我认为是因为nil或false而不是“ layoutname”。然后系统尝试对所有其他操作使用“ controllername”布局,而忽略应用程序布局。尝试使用此参数,您将了解所有这些。
Antiarchitect 2010年

2
您是正确的,:only在上无法正常工作layout nil。但是,我可以通过调整布局并将其添加回去来使它正常工作。我已经更新了答案。
mckeed 2010年

2
大卫·奥尔蒂斯(David Ortiz)的回答“更正确”,因为它可以正确地将布局切换隔离到相关的单独操作中。
Frank Koehl

我同意@Paul-可行false!感谢那!
mrstif

layout false, only: :view感觉像是一种更简洁的方法来实现相同的目标,而没有诸如Antiarchitect所述的副作用。
SMAG


11

在响应块中,添加layout: false

例如:

respond_to do |format|
  format.html { render :layout => false } # your-action.html.erb
end

2

如果要获取非标准模板,且没有布局,则可以使用:

def non_rest
  render template: 'layouts/something_new', layout: false
end
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.