カテゴリー:
Rails
タグ:
 Rails レイアウト ネスト

このエントリーをはてなブックマークに追加
更新日時:
2013年02月26日(火)
作成日時:
2013年02月26日(火)

前の記事 / 次の記事

railsでネストしたレイアウトを実現する
Rails3レシピブックRecipe109 ネストしたレイアウトファイルを使う(p249) を参考に。

外側のレイアウト

$vi apps/views/layouts/application.html.haml
%html
  %head
    %title Nested Layout
  %body
    =content_for?(:layout_inner) ? yield(:layout_inner) : yield

内側のレイアウト

$vi apps/views/products/layouts/menu.html.haml
- content_for(:layout_inner) do
  %ol.menu
    %li index
    %li new
    %li edit
    %li destroy
  %div.content
    =yield
  -# 次の一行がポイント
  =render :template => "layouts/application"

  -# この時、次のようには書けない
  =render :layout => "layouts/application" do
    %ol.menu
      %li index
      %li new
      %li edit
      %li destroy
    %div.content
      =yield

indexアクションに対応するテンプレート

$vi apps/views/products/index.html.haml
%dl
  - @products.each do |product|
    %dt=product.name
    %dd=product.description

コントローラー

ProductsController < ActionController::Base

layout "products/layouts/menu"

def index
  @products = Product.all
end

レイアウトを適用する時に、:layout_inner が存在していればそれに対して、
存在していなければデフォルトのコンテンツに対して、レイアウトを適用する。

ちなみに yield した時のデフォルトは :layout なので、
単純に最下部にコンテンツを追加するような場合は、
ネストしたレイアウトを作成しなくても、ビュー中の適当なヶ所で

-# haml
- content_for(:layout) do
  %p.content-appended family stadium
  %p.content-appended family racing
  %p.content-appended family jockey

等とすることでアペンド出来る。