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?

Antiarchitect
quelle
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
mckeed
quelle
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
116

Das sollte es tun,

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

Link zur Dokumentation

David Ortiz
quelle
Das Problem dabei ist, dass Sie layout: falsefür jedes Format in der Aktion angeben müssen .
JellicleCat
1
Das Leben ist schön, wenn es Antworten gibt! :-D
Pedro Rolo
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
Archonisch
quelle
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
Mugur 'Bud' Chirica
quelle