Вимкніть макет для однієї дії


81

Моя ситуація: Перегляд дії ReportsController повинен відображати чистий html, але не як файл (щоб переглянути його у браузері та зберегти після). Тому для візуалізації я використовую шаблон перегляду view.html.erb, і я неет вимикати будь-які макети для цієї дії. Але в інших діях цього макета контролера не слід торкатися. Працює лише вимкнення для цілого контролера, як це:

ReportsController < ApplicationController
  layout false

Але це робить неправильно :( для всіх дій я намагався використовувати щось подібне в дії:

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

Що я повинен зробити?


Ну, вам точно не потрібно це явне повернення. Ви хочете, щоб макет відображався, якщо звіт дійсний?
tfwright

Відповіді:


73

Спробуйте це:

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

Здається, ця директива працює неправильно (або несподівано). Я намагався використовувати деякі комбінації цих параметрів (: only,: освен). Але це дивно працювало, видаляючи всі макети для всіх дій. Я думаю, що це через nil або false замість 'layoutname'. І система намагається використовувати макети "ім'я контролера" для всіх інших дій, ігноруючи макет програми. Спробуйте пограти з цими параметрами, і ви зрозумієте, про що це все.
Антиархітект

2
Ви маєте рацію, :onlyне працює належним чином layout nil. Однак мені вдалося змусити його працювати, скинувши макет і додавши його назад, за винятком. Я оновив свою відповідь.
mckeed

2
Відповідь Девіда Ортіса є "більш правильною", оскільки вона правильно ізолює перемикач макета до самотньої дії, про яку йдеться.
Frank Koehl

Я згоден з @Paul - falseпрацює! Дякую за це!
mrstif

layout false, only: :viewвідчуває себе більш стислим способом досягнення тієї ж мети без побічних ефектів, як згадує Антиархітект.
SMAG


11

У блоці відповіді додайте layout: false.

Наприклад:

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

2

Якщо ви хочете отримати нестандартний шаблон, без макета, ви можете використовувати:

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

Як щодо навпаки - чи можу я зробити макет за замовчуванням без шаблону?
Касім
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.