レイアウトと部分テンプレート

まずは、アプリ共通デザインのレイアウトから

  • 要するに、ヘッダ/フッタやメニューを作るってことね。
  • Railsだと、app/views/layouts/application.html.erbに書くのが基本だけど、他にも書ける
    • コントローラ単位:app/views/layouts/コントローラ名.html.erb に書く
    • コントローラでlayoutメソッド:コントローラで、layoutメソッドを書く
      class MyController < ApplicationController
        layout 'my'
      end
      
      • これだと、app/views/layouts/my.html.erb が適用
    • アクション単位:renderメソッドで、:layoutを指定
      def index
        render :layout => my
      end
      
      • これだと、app/views/layouts/my.html.erb が、indexメソッドに適用
    • layoutメソッドにfalseを指定したり、renderで:text/:file/:inline等を指定すると、レイアウトが無効になる
  • レイアウト内に複数コンテンツを設置
    • 基本は、application.html.erbとかに書いてある「<%= yield %>」が個別のテンプレートとして展開されてる
    • これだけだと1つしか展開できないけど、このyieldは、こんな感じで引数を指定できる
      <%= yield :my_menu %>
      
    • あとは、これを個別テンプレート側で、content_forで指定すればOK
      <% content_for :my_menu do %>
        必要なmy_menu
      <% end %>
      こっからメインメニュー
      
    • ちなみに、yieldで指定されたコンテンツがテンプレートに無くても、例外は出ない
  • 簡単ヘッダーはこんな感じで!
    • まずは、views/layouts/application.html.erb のyieldの前で、ヘッダ呼び出し
       <%= render 'shared/header' %>
       <%= yield %>
      
    • で、ファイル名 views/shared/_header.html.erb にヘッダの内容を書けばOK!
      • これ、部分テンプレートなんで、ファイル名の先頭が_(アンダースコア)な事に注意!!

部分テンプレート

  • こっちは、「似たような」箇所を共通にする場合に使う。
  • 部分テンプレートのルールはこんな感じ
    • ファイルの先頭は、「_」が必須
    • 保存先は、以下が推奨
      • コントローラ用:/views/コントローラ名
      • アプリ全体:/views/shared
      • リソース関連:/views/リソース名(複数形)
  • ほー、フォルダは複数形、ファイルは単数形なんだ。
  • 部分テンプレートは、パラメタを使えるんだ。こんな感じ
    • まずは、元テンプレートでこう書く
      <%= render 'books/book', :book => @book, :type = :details %>
      
    • で、部分テンプレート(_book.html.erb)側でこんな感じで書けば、いけるらしい
      <%= type = :details if type.nil? %>
      <% if type == :details %>
        <%= book.isbn %>
      <% end %>
      
      • 変数のtypeやbookに、@が無いんだねー
    • モデルに渡す場合は、省略して書けるんだ。以下の2つは一緒なんだー。へー。
      <%= render 'books/book', :book => @book %>
      <%= render @book %>
      
  • 繰り返し部分に部分テンプレートを使用する
    • これは、renderメソッドに、:collectionオプションを指定すればイケルんだ!
      <%= render :partial => 'books/book', :collection => @books, :locals => { :type => :details} %>
      
    • 上記のコードは以下と一緒なんだー。
      <% @books.each do |book| %>
        <%= render 'books/book', :book => @book :type => :details %>
      <% end %>
      
      • :coolectionを使う場合、:partialは省略不可で、パラメタは:localsで渡さないと駄目
    • へー、モデルなら、もっと簡単に書ける
      <%= render :partial => @books, :locals => { :type => :details} %>
      
      • 更にパラメタがいらないなら、これだけでもOK
        <%= render :partial => @books %>
        
    • 以下のように:spacer_templateで、区切り文字列(<hr />)を指定できるらしいんだが、どうにもエラーが出てる
      <%= render :partial => @books, :spacer_template => 'separator' %>
      
      • うーん、結局最後のseparatorの意味が判らんな…。ネットだと、こっちだという意見もあるし。
        <%= render :partial => @books, :spacer_template => 'spacer' %>
        
      • だいたい、なんだろ、このseparatorって?後で調べよう...
      • 判った。これこそ、部分テンプレートなんだ…。なんでこの場合は、[app/views/books/_separator.html.erb]ファイルが無かったからか。ださい。

-
最終更新:2012年08月10日 05:47