アクションの1つのレイアウトをオフにします


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 2010年

回答:


73

これを試して:

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

このディレクティブは正しく機能しない(または予期しない)ようです。これらのパラメーターのいくつかの組み合わせを使用しようとしました(:only、:except)。しかし、すべてのアクションのすべてのレイアウトを削除すると、奇妙に機能しました。'layoutname'の代わりにnilまたはfalseが原因だと思います。また、システムは、アプリケーションレイアウトを無視して、他のすべてのアクションに「controllername」レイアウトを使用しようとします。このパラメータを試してみると、これが何であるかが理解できます。
Antiarchitect 2010年

2
あなたは正しいです、で:only正しく動作しませんlayout nil。ただし、レイアウトを削除して、例外を除いて追加し直すことで、機能させることができました。回答を更新しました。
mckeed 2010年

2
David Ortizによる回答は、レイアウトスイッチを問題の唯一のアクションに適切に分離するため、「より正確」です。
Frank Koehl 2015

@Paulに同意します-false動作します!それをありがとう!
mrstif 2015年

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.