Wyłącz układ dla jednej akcji

81

Moja sytuacja: akcja View programu ReportsController powinna renderować czysty html, ale nie jako plik (aby wyświetlić go w przeglądarce i zapisać). Więc do renderowania używam szablonu widoku view.html.erb i nie chcę, aby wyłączyć wszelkie układy dla tej akcji. Ale w innych działaniach tego kontrolera układy powinny pozostać nietknięte. Działa tylko wyłączając cały kontroler w ten sposób:

ReportsController < ApplicationController
  layout false

Ale robię to źle :( dla wszystkich działań próbowałem użyć czegoś takiego w akcji:

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

Co powinienem zrobić?

Antiarchitect
źródło
Cóż, zdecydowanie nie potrzebujesz tego wyraźnego zwrotu. Czy chcesz, aby układ był renderowany, jeśli raport jest prawidłowy?
tfwright

Odpowiedzi:

73

Spróbuj tego:

ReportsController < ApplicationController
  layout false
  layout 'application', :except => :view
mckeed
źródło
Wygląda na to, że ta dyrektywa działa nieprawidłowo (lub nieoczekiwanie). Próbowałem użyć kilku kombinacji tych parametrów (: tylko,: z wyjątkiem). Ale działało dziwnie, usuwając wszystkie układy dla wszystkich akcji. Myślę, że to z powodu nil lub false zamiast „nazwa układu”. A system próbuje używać układów „nazwa kontrolera” dla wszystkich innych działań, ignorując układ aplikacji. Spróbuj pobawić się tymi parametrami, a zrozumiesz, o co w tym wszystkim chodzi.
Antiarchitect
2
Masz rację, :onlynie działa poprawnie layout nil. Udało mi się to uruchomić, niwelując układ i dodając go z powrotem, z wyjątkiem jednak. Zaktualizowałem odpowiedź.
mckeed
2
Odpowiedź Davida Ortiza jest „bardziej poprawna”, ponieważ prawidłowo izoluje przełącznik układu od pojedynczej akcji, o której mowa.
Frank Koehl
Zgadzam się z @Paul - falsedziała! Dziękuję za to!
mrstif
layout false, only: :viewwydaje się bardziej zwięzłym sposobem na osiągnięcie tego samego celu bez skutków ubocznych, o których wspomina Antiarchitect.
SMAG
116

To powinno wystarczyć,

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

Link do dokumentacji

David Ortiz
źródło
Problem polega na tym, że musisz określić layout: falsedla każdego formatu w akcji.
JellicleCat
1
życie jest piękne, gdy są odpowiedzi! :-D
Pedro Rolo
11

W bloku odpowiedzi dodaj layout: false.

Na przykład:

respond_to do |format|
  format.html { render :layout => false } # your-action.html.erb
end
Archonic
źródło
2

Jeśli chcesz uzyskać niestandardowy szablon, bez układu, możesz użyć:

def non_rest
  render template: 'layouts/something_new', layout: false
end
Mugur „Bud” Chirica
źródło
A może na odwrót - czy mogę wyrenderować domyślny układ bez szablonu?
Qasim