Deaktivieren Sie das Layout für eine Aktion


81

Meine Situation: Die Aktion "Anzeigen von ReportsController anzeigen" sollte reines HTML rendern, jedoch nicht als Datei (um sie im Browser anzuzeigen und anschließend zu speichern). Zum Rendern verwende ich also die Ansichtsvorlage view.html.erb und neet, um alle Layouts für diese Aktion zu deaktivieren. Bei anderen Aktionen dieses Controllers sollten Layouts jedoch unberührt bleiben. Funktioniert nur beim Ausschalten für den gesamten Controller wie folgt:

ReportsController < ApplicationController
  layout false

Aber das macht es falsch :( Für alle Aktionen habe ich versucht, so etwas in Aktion zu verwenden:

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

Was soll ich machen?


Nun, diese explizite Rückgabe brauchen Sie definitiv nicht. Möchten Sie, dass das Layout gerendert wird, wenn der Bericht gültig ist?
tfwright

Antworten:


73

Versuche dies:

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

Es scheint, dass diese Richtlinie falsch (oder unerwartet) funktioniert. Ich habe versucht, einige Kombinationen dieser Parameter zu verwenden (: nur ,: außer). Aber es hat seltsam funktioniert, alle Layouts für alle Aktionen zu entfernen. Ich denke, es liegt an Null oder Falsch anstelle von 'Layoutname'. Das System versucht, für alle anderen Aktionen "Controllername" -Layouts zu verwenden, wobei das Anwendungslayout ignoriert wird. Versuchen Sie, mit diesen Parametern zu spielen, und Sie werden verstehen, worum es geht.
Antiarchitect

2
Du hast recht, :onlyfunktioniert nicht richtig layout nil. Ich konnte es zum Laufen bringen, indem ich das Layout ausfüllte und es mit Ausnahme wieder hinzufügte. Ich habe meine Antwort aktualisiert.
mckeed

2
Die Antwort von David Ortiz ist "korrekter", da der Layout-Schalter ordnungsgemäß auf die betreffende Einzelaktion isoliert wird.
Frank Koehl

Ich stimme @Paul zu - falsefunktioniert! Dank dafür!
Mrstif

layout false, only: :viewEs scheint eine präzisere Möglichkeit zu sein, dasselbe Ziel ohne Nebenwirkungen zu erreichen, wie dies von Antiarchitect erwähnt wird.
SMAG


11

Fügen Sie im Antwortblock hinzu layout: false.

Zum Beispiel:

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

2

Wenn Sie eine nicht standardmäßige Vorlage ohne Layout erhalten möchten, können Sie Folgendes verwenden:

def non_rest
  render template: 'layouts/something_new', layout: false
end
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.