第2回 変数、配列、ハッシュ

2007/10/01

今回は変数を作ってテンプレートの中に埋め込み、HTMLデータを生成する方法について説明します。
次のRubyプログラムを見てください。

@title = 'プレスリリース'

これはインスタンス変数の定義の例です。アットマーク(@)で始まるのが特徴です。インスタンス変数の値は、次のようにテンプレートの中に埋め込むことができます。

<h1><%= @title %></h1>

これを先ほどのプログラムと組み合わせると、次のようなHTMLコードになります。

<h1>プレスリリース</h1>

Ruby on Railsでは、インスタンス変数を埋め込んでテンプレートからHTMLコードを生成することをレンダリングと呼んでいます。また、レンダリングに必要なインスタンス変数を定義するプログラムをアクションといいます。

冒頭のRubyプログラムをもう一度見てください。他の多くのプログラミング言語と同様、Rubyの場合でも文字列はシングルクオートまたはダブルクオートで囲みます。Rubyの場合には、文の終わりに特別な終端記号を置く必要ありません。行末がそのまま文の終わりになります。Java, Perl, PHPなどの言語でセミコロンが文末を示す記号として使われるのと対照的です。ただし、Rubyでもセミコロンを文の区切りとして使うことができます。

@title = '社長挨拶'; @subtitle = '当社の経営理念'

さて、もう少し複雑なことをするために配列を使ってみましょう。

配列(Array)とは、オブジェクトの集合です。「オブジェクト」という言葉についてはまだ説明していませんが、ここでは「データ」の言い換えと考えてください。配列の特徴は、中身のオブジェクトに順番が付けられていて、番号(添え字)でオブジェクトを取り出すことができる、ということです。

次のRubyプログラムでは、インスタンス変数 @principles に文字列の配列を格納しています。

@principles = ['自律', '調和', '変革']

Rubyでは、大括弧で囲んで配列を定義します。配列のそれぞれの要素の間は、コンマで区切ります。特定の要素を取り出すには、変数名の後に要素の番号を大括弧で囲んで指定します。次のRubyコードは '自律' という文字列を返します。配列の番号は 0 から始まる点に注意してください。

@principles[0]

次の例は @principles の各要素をテンプレートに埋め込んでみたものです。

<ol>
<% @principles.each do |p| -%>
  <li><%= p %></li>
<% end -%>
</ol>

配列のメソッド each が使われています。「メソッド」という言葉の説明を始めると長くなりますので、後回しにします。ここでは、配列の要素を一つずつローカル変数 p に代入しながら do から end までを繰り返す、という働きをしています。ローカル変数は、ある狭い範囲で一時的に使用する使い捨ての変数です。このテンプレートをレンダリングすると、次のようになります。

<ol>
  <li>自律</li>
  <li>調和</li>
  <li>変革</li>
</ol>

Rubyプログラムとテンプレートと結果のHTMLデータをよく見比べて、まずは直感的に把握してください。

テンプレートを詳しく見ていきましょう。

まず目立つのは <% ... %> という構造です。この構造は最初に見たテンプレートにも現れていましたが、今度のテンプレートでは、<% の直後に等号(=)のないパターンがあります。いずれの場合も、<% から %> の間は Ruby コードとして評価されます。ちなみに「評価する」とは「プログラムを実行してその結果を得る」という意味の〈業界用語〉です。等号付きの場合は、評価して得られた値がその場所に埋め込まれますが、等号なしの場合は埋め込まれません。

もう一つ、%> の直前にマイナス記号(-)にあるかないか、というパターンがあります。このマイナス記号は %> の後ろにある「改行文字」を除去するものです。これがないと、生成されるHTMLコードにおいて ol 要素の内側に余分な空行が1つずつ挿入されてしまいます。空行があってもなくてもブラウザでの表示に影響はありませんが、結果のHTMLコードはなるべく簡潔に保ちたいものです。

次に気になるのは、Ruby独特の記法、ローカル変数を囲む縦棒(|)です。次の例を見てください。

<div>
<% 4.times do |i| -%>
  <%= i + 1 %><br />
<% end -%>
</div>

これをレンダリングすると、こうなります。

<div>
  1<br />
  2<br />
  3<br />
  4<br />
</div>

eachtimes のようなメソッドの直後に配置された do から end までの Ruby コードをブロックと呼びます。整数オブジェクトのメソッド times は、0 からその整数 - 1 までの値をブロックに渡しながら、ブロックを繰り返し評価するという機能を持ちます。2つの縦棒はブロックに渡される値、すなわち引数を示す記号です。(整数がオブジェクトであること、整数がメソッドを持つことに驚いた方は、今後をお楽しみに!)

配列の次はハッシュを使ってみましょう。

「ハッシュ」は別名「連想配列」とも呼ばれ、オブジェクトの集合である点では配列と同類です。相異点は2つあります。一つは各要素の間に順序が定められていない点、もう一つは各要素にキーが与えられている点です。次の Ruby プログラムを見てください。

@boss = { 'name' => '山田太郎', 'age' => 58, 'title' => '代表取締役' }

インスタンス変数 @boss に、ハッシュが格納されています。このハッシュには要素が3つあります。その一つは、キーが 'name' で値が '山田太郎' です。繰り返しになりますが、ハッシュの要素間には順番がない、という点に注意してください。

ハッシュは中括弧で囲んで記述します。各要素の間はコンマで区切り、キーと値を => で結び付けます。

値を取り出すための書き方は、配列とよく似ています。番号の代わりにキーを大括弧の中で指定してください。以下、ハッシュを使ったテンプレートの例とそのレンダリング結果を続けて示します。

<table>
  <tr><th>役職</th><td><%= @boss['title'] %></td></tr>
  <tr><th>氏名</th><td><%= @boss['name'] %></td></tr>
  <tr><th>年齢</th><td><%= @boss['age'] %></td></tr>
</table>
<table>
  <tr><th>役職</th><td>代表取締役</td></tr>
  <tr><th>氏名</th><td>山田太郎</td></tr>
  <tr><th>年齢</th><td>58</td></tr>
</table>

次回は、メインのテンプレートを別のテンプレートで囲む方法と、一部分を別のテンプレートに分離する方法を解説します。