Layout in Rails


参照リンク:http://guides.rubyonrails.org/layouts_and_rendengings.co.tructuring-layouts
ラyout
ラyoutの基本的な使い方は簡単です。
デフォルトのlayoutはap/view/layoutディレクトリの中でcontrollerと同名のテンプレートです。他のレイアウトに指定するなら、controlerで呼び出すことができます。
layoutメソッドは、このようにしています。
class ProductsController < ApplicationController 
 layout "inventory"
 #....
end
その後、すべてのactionはap/view/layout/inventry.html.erbをレイアウトにしてテンプレートをレンダリングします。layoutメソッドはまだサポートされています。
:exceptと
:onlyの二つのオプションは、layoutの方法が影響するactionを選択します。名前の通りにしましょう。覚えません。
layout "product", :except => [:index, :rss] 
ダイナミックレイアウト
ラyoutメソッドのパラメータがsmbolである場合、このcontrolのレイアウトはダイナミックであり、controlでsmbolに対応する方法を定義しなければならない(一般的にはprvateでよい)、この方法は文字列を返して、レイアウトの名前として使わなければならない。
class ProductsController < ApplicationController
 layout :products_layout 
 def show
  @product = Product.find(params[:id]) 
 end

 private
 def products_layout
  @current_user.special? ? "special" : "products" 
 end
end 
このように書いてもいいです。
class ProductsController < ApplicationController
 layout proc { |controller| controller.request.xhr? ? 'popup' : 'application' }
 # ... 
end 
構造化配置(Structuring Layouts)
アスセットTags
javascript_include_タグ
ページにjsファイルを紹介します。public/javascripts/main.js:
<%= javascript_include_tag "main" %>
public/javascripts/main.jsとpublic/javascripts/columns.jsを導入する:
<%= javascript_include_tag "main", "columns" %>
public/javascripts/main.jsとpublic/photos/columns.jsを導入する:
<%= javascript_include_tag "main", "/photos/columns" %>
導入するhttp://example.com/main.js:
<%= javascript_include_tag "http://example.com/main.js" %>
:defaultsオプションはProttypeとScript aculousライブラリを導入するために使用できます。
<%= javascript_include_tag :defaults %>
:allオプションはpublic/javascriptsディレクトリの各jsファイルを読み込み、ProttypeとScripptaculousで始まる:
<%= javascript_include_tag :all %> 
:recursiveオプションは、public/javascriptsディレクトリのサブディレクトリのjsファイルを含むかどうかを指定します。
<%= javascript_include_tag :all, :recursive => true %>
複数のjsファイルをロードした場合、設定:catchオプションtrueで複数のjsファイルを一つのjsファイルに結合し、ユーザー体験を向上させることができます。
<%= javascript_include_tag "main", "columns", :cache => true %>
デフォルトでは、これらのjsファイルはjavascripts/all.jsに組み込まれます。キャッシュファイルの位置を手動で指定できます。
<%= javascript_include_tag "main", "columns", :cache => 'cache/main/display' %>
ダイナミックなパスを使うこともできます。このように、cache/carrent/main/display.
styreesheetlink_タグ
styreesheetlink_の使用は大体javascriptと同じです。include_それがないだけです。defaultsオプションです。また、styless heetlink_多くなりました。media、:relとtypeの3つのオプションは、styreet linkのmedia、relとtypeの値を指定するために使用されます。デフォルトの値は、media=「screen」rel=「stylist」type=「text/css」です。
layoutの中のyield
layoutの中で、yieldはviewの挿入すべきところを識別するために使います。このように:
<html> 
 <head> 
 </head> 
 <body> 
 <%= yield %> 
 </body> 
</html> 
パラメータ付きのyieldは一般的にcontent_と同じです。forを一緒に使う:
<!--layout-->
<html> 
 <head> 
 <%= yield :head %> 
 </head> 
 <body>
  <%= yield %> 
 </body> 
</html> 
<!--view-->
<% content_for :head do %> 
 <title>A simple page</title> 
<% end %> 
<p>Hello, Rails!</p> 
<!--  -->
<html> 
 <head>
  <title>A simple page</title> 
 </head> 
 <body>
  <p>Hello, Rails!</p> 
 </body> 
</html> 
パーティー
partialをviewの一部としてレンダリングすると、レンダーの方法を呼び出すことができます。
<%=render :partial=>"menu"%>
上のコードはファイル名を_と言います。menu.html.erbのテンプレートは現在のテンプレートにレンダリングされます。
<%= render :partial => "shared/menu" %> 
レンダリングアプリ/views/shared/umenu.html.erbは現在のテンプレートになります。
partialのために単独でlayoutを指定することができます。
<%= render :partial => "link_area", :layout => "graybar" %> 
partialのlayoutファイル名は以下の線で始まる必要があります。graybar.html.erb、そしてlayoutテンプレートファイルとpartialを同じディレクトリの下に置かなければなりません。
パーティーにローカル変数を渡す
:locarsオプションは、partialのローカル変数を設定するために使用されます。
<%= render :partial => "form", :locals => { :button_label => "Create zone", :zone => @zone } %> 
これでいいですform.html.erbでbutton_を訪問します。labelとzoneの二つの変数。
各partialはpartialの名前と同じ局部変数があります。
<%= render :partial => "customer", :object => @new_customer %> 
これでいいですcustomer.html.erbでcustomerという変数を訪問します。それは@new_を指します。customer
もちろん、親テンプレートの一部として、partialは親テンプレートのインスタンス変数、例えばここの@new_customerですが、このようにすれば、partialは親テンプレートと結合して、使いにくくなります。したがって、直接的にインスタンス変数にアクセスするのではなく、partialの名前を使用することを提案します。
以前のバージョンのRailsでは、Objectまたは:locarsオプションを指定しないと、RAlsは自動的に親テンプレートの中でpartialと同名のそのインスタンス変数をpartialの局所変数として探します。
<%= render :partial => "customer" %> 
もしいるならcustomer.html.erbはcustomerという変数にアクセスします。RAlsは自動的に親テンプレートから@customerというインスタンス変数を探します。この特性はRails 2.2ではもう推奨されていません。Rails 3.0はこの特性を除去しました。
partialのインスタンス変数名==partial名==model名に渡すなら、簡単に書くことができます。
# @customer Customer  model   ,  partial  customer 
<%= render :partial => @customer %> 
#   
<%= render :partial => "customer", :object=>@customer %> 
レンダリング集合
:collectionオプションは、partialに渡される集合オブジェクトを指定するために使用され、book sという集合があると仮定して、含まれています。
5つのBookオブジェクトは、このように使用できます。
#main.html.erb
<%= render :partial => "book", :collection => books %>
#_book.html.erb
<p><%= book.name%></p>
このように、main.html.erbでは、_book.httml.erbの内容はレンダリングされます。
5回です。この時、partialテンプレートの中で、partialと同名のその変数は、collectionオプションから伝わってくる集合の中の各項目を指しています。partialと同名の変数名を使いたくないなら、asオプションであなたが欲しい変数名を設定できます。
:asの値はsmbolしか使えません。stringではなく、partialでnil値が得られます。
<%= render :partial => "product", :collection => @products, :as => :item %> 
設定:collectionオプションの時、RAlsは同時にpartialテンプレートにcounter変数を提供しました。変数名はpartial名(下線を付けない)で始まります。counterは終了し、テストした結果、この変数名はasオプションの影響を受けませんでした。つまり、上のコードの中で、この変数名はproductコントロールであって、itemucounterではありません。その値は、collectionオブジェクトのインデックス値(0から開始)である。
:spacer_templateオプションは、collectionの各メンバー間に埋め込まれたテンプレートを指定するために使用されます。
<%= render :partial => "product", :collection => @products, :spacer_template => "product_ruler" %> 
上のコードの中で、_プロジェクトruler.httml.erbの内容は各ペアに充填されます。product partialの間。
と:objectのように、collectionにも簡潔な形式があります。
<%= render :partial => @products %>