작업 중 하나에 대한 레이아웃 끄기


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, : except). 그러나 모든 작업에 대한 모든 레이아웃을 제거하면 이상하게 작동했습니다. 나는 'layoutname'대신 nil 또는 false 때문이라고 생각합니다. 그리고 시스템은 애플리케이션 레이아웃을 무시하는 다른 모든 작업에 대해 'controllername'레이아웃을 사용하려고합니다. 이 매개 변수를 가지고 놀아 보면이 모든 것을 이해할 수있을 것입니다.
Antiarchitect

2
당신 말이 맞습니다 .에서 :only제대로 작동하지 않습니다 layout nil. 그러나 레이아웃을 무효화하고 예외와 함께 다시 추가하여 작동시킬 수있었습니다. 내 답변을 업데이트했습니다.
mckeed

2
David Ortiz의 답변은 "더 정확"합니다. 레이아웃 스위치를 문제의 단독 작업으로 적절하게 분리하기 때문입니다.
Frank Koehl

@Paul에 동의합니다- false작동합니다! 감사합니다!
mrstif 17:37에

layout false, only: :viewAntiarchitect 언급과 같은 부작용없이 동일한 목표를 달성하는보다 간결한 방법처럼 느껴집니다.
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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.