レイアウト

レイアウトの指定

class AbcController < ApplicationController
  layout "xyz" # <--レイアウトの名前
  layout :determine_layout # <--レイアウトの名前を返すインスタンスメソッド

  def xxx
    # レイアウトの名前は、app/views をルートとして考える
    render :layout => "layouts/xyz"
  end

  private
  def determine_layout
    "xyz"
  end
end

レイアウトのキャンセル

class AbcController < ApplicationController
  def xxx
    render :layout => false
  end
end

部分テンプレート

部分テンプレートのファイル名の先頭はアンダーバー。
部分テンプレートとのやりとりはローカル変数で行う。
ローカル変数は部分テンプレートの名前で定義される。
ローカル変数に値を渡すには、

  • コントローラで、テンプレートの名前でインスタンス変数を定義する
  • :object パラメータ
  • :collection パラメータ
<%= render(:partial => "abc", :object => @var) %>
<%= render(:partial => "abc", :collection => @vars %>

コンポーネント

コンポーネントとは、コントロールとテンプレートのセットのこと。
コンポーネントを汎用的に使うためには、componentsディレクトリにモジュール名をつけて、
コントロールとテンプレートを置く。

components/my_test/abc_controller.rb
components/my_test/abc/xxx.rthml

class MyTest::Abc < ActionController::Base
  uses_component_template_root

  def xxx
  end
end

render と render_component

render :action => "demo"

↑ demoアクションで使うテンプレートをレンダリングするが、demoメソッドは実行されない。

render_compoent :action => "demo"

↑ demoアクションが実際に実行される。demoメソッドは実行される。
レスポンスは生成されるので、render_componentのあとにrenderを行うと、DoubleRenderError。
render_component_as_stringはレスポンスを生成しないで、結果を文字列で返す。