82
votes

My situation: View action of ReportsController should render pure html, but not as a file (to view it in browser and save it after). So for rendering I use view template view.html.erb and i neet to turn off any layouts for this action. But in other actions of this controller layouts should stay untouched. Works only turning off for whole controller like this:

ReportsController < ApplicationController
  layout false

But that doing it wrong :( for all the actions I tried to use something like this in action:

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

What should I do?

4
Well, you definitely don't need that explicit return. Do you want the layout to render if the report is valid?tfwright

4 Answers

74
votes

Try this:

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

This should do it,

def view
    ...
    render :layout => false
end

Link to Documentation

11
votes

In the respond block, add layout: false.

For example:

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

If you want to get a non-standard template, with no layout you can use:

def non_rest
  render template: 'layouts/something_new', layout: false
end