Views

ERB テンプレート

ビュー生成には ERB が用いられます。PHP のように Ruby 構文を含めることができます。

<ul>
  <% 1.upto(10) do |n| %>
  <li><%= sprintf('Item %d', n) %></li>
  <% end %>
</ul>

<% time = Time.new %>
Last updated at <%= time.strftime('%Y/%m/%d') %>

<%# これはコメントブロックです。出力されません %>

Rails3 からはデフォルトでHTMLエスケープされた結果が出力されます。HTMLエスケープをスキップするには raw メソッドを使います

<!-- &lt;strong&gt;foo&lt;/strong&gt; -->
<%= '<strong>foo<strong>' %>

<!-- <strong>foo</strong> -->
<%= raw '<strong>foo<strong>' %>
<!-- <%== .... %> 構文も使えます -->
<%== '<strong>foo<strong>' %>

テンプレートからレイアウトテンプレートにコンテンツを渡す

content_for メソッドを使います。

app/views/(:controller)/(:action).html.erb:

<% content_for :link do %>
<link rel="next" href="..." />
<link rel="prev" href="..." />
<% end %>
<% content_for :title do %>Home<% end %>
<h1><%= content_for :title %></h1>

app/views/layouts/*.html.erb:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title><%= content_for?(:title) ? sprintf('%s | Sandbox', (yield :title)) : 'Sandbox' %></title>
  <%= yield :link >
</head>
<body>
<%= yield %>
</body>
</html>

他ファイルのインクルード

render メソッドにより他のファイルを差し込むことができます。

app/views/(:controller)/_(name_of_partial).html.erb のように先頭にアンダースコアを付与したファイル名を読み込みます。

<!-- app/views/(:controller)/_item.html.erb -->
<%= render :partial => 'item' %>

<!-- app/views/layouts/_navs.html.erb -->
<%= render :partial => 'layouts/navs' %>

:locals により、インクルードファイルに変数を渡すことができます。

  ....
  <%= render :partial => 'layouts/footer', :locals => { :time => Time.new } %>
  </body>
</html>

app/views/layouts/_footer.html.erb:

<div class="footer">Last updated: <%= time.strftime('%Y/%m/%d') %></div>

:collection でリストを渡して繰り返すことができます。:partial で指定した item がローカル変数として割り当てられます。(partial_name)_counter にはリストのインデックス値が割り当てられます。

<%= render :partial => 'item', :collection => @items %>

app/views/(:controller)/_item.html.erb:

<li><%= item_counter + 1 >. <%= item %></li>

partial_name を明示的に指定するには :as で指定します。

<%= render :partial => 'product', :collection => @products, :as => 'element' %>

URLの一元管理

url_for メソッドで config/routes.rb で設定したマッピングで URL を取得できます。

<%= url_for :controller => 'pages', :action => 'help', :format => 'html' %>

(name_of_route)_path (name_of_route)_url メソッドで指定することもできます。

<!-- /pages/help.html -->
<%= pages_help_path(:format => 'html') %>

<!-- http://www.exmaple.net/pages/help.html -->
<%= pages_help_url(:format => 'html') %> #

link_to メソッドでリンク記述を簡略化できます。

<%= link_to :controller => 'pages', :action => 'help', :format => 'html' do %>Help<% end %>
<%= link_to 'Back To Home', pages_home_path(:format => 'html') %>