Layout in Rails
7550 ワード
参照リンク:http://guides.rubyonrails.org/layouts_and_rendengings.co.tructuring-layouts
ラyout
ラyoutの基本的な使い方は簡単です。
デフォルトのlayoutはap/view/layoutディレクトリの中でcontrollerと同名のテンプレートです。他のレイアウトに指定するなら、controlerで呼び出すことができます。
layoutメソッドは、このようにしています。
:exceptと
:onlyの二つのオプションは、layoutの方法が影響するactionを選択します。名前の通りにしましょう。覚えません。
ラyoutメソッドのパラメータがsmbolである場合、このcontrolのレイアウトはダイナミックであり、controlでsmbolに対応する方法を定義しなければならない(一般的にはprvateでよい)、この方法は文字列を返して、レイアウトの名前として使わなければならない。
アスセットTags
javascript_include_タグ
ページにjsファイルを紹介します。public/javascripts/main.js:
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の挿入すべきところを識別するために使います。このように:
partialをviewの一部としてレンダリングすると、レンダーの方法を呼び出すことができます。
partialのために単独でlayoutを指定することができます。
パーティーにローカル変数を渡す
:locarsオプションは、partialのローカル変数を設定するために使用されます。
各partialはpartialの名前と同じ局部変数があります。
もちろん、親テンプレートの一部として、partialは親テンプレートのインスタンス変数、例えばここの@new_customerですが、このようにすれば、partialは親テンプレートと結合して、使いにくくなります。したがって、直接的にインスタンス変数にアクセスするのではなく、partialの名前を使用することを提案します。
以前のバージョンのRailsでは、Objectまたは:locarsオプションを指定しないと、RAlsは自動的に親テンプレートの中でpartialと同名のそのインスタンス変数をpartialの局所変数として探します。
partialのインスタンス変数名==partial名==model名に渡すなら、簡単に書くことができます。
:collectionオプションは、partialに渡される集合オブジェクトを指定するために使用され、book sという集合があると仮定して、含まれています。
5つのBookオブジェクトは、このように使用できます。
5回です。この時、partialテンプレートの中で、partialと同名のその変数は、collectionオプションから伝わってくる集合の中の各項目を指しています。partialと同名の変数名を使いたくないなら、asオプションであなたが欲しい変数名を設定できます。
:asの値はsmbolしか使えません。stringではなく、partialでnil値が得られます。
:spacer_templateオプションは、collectionの各メンバー間に埋め込まれたテンプレートを指定するために使用されます。
と:objectのように、collectionにも簡潔な形式があります。
ラ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 %>