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ć?


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

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


11

W bloku odpowiedzi dodaj layout: false.

Na przykład:

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

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

A może na odwrót - czy mogę wyrenderować domyślny układ bez szablonu?
Qasim
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.