第6回 YAMLファイルの扱い方

2007/12/03

Ruby on Railsの「業界」では、構造化されたデータを表現するフォーマットとして XML よりも YAML が好まれているようです。

YAML は、"YAML Ain't Markup Language" という冗談のような名前の省略形です。「ヤムル」と発音されます。本稿では、YAML の詳しい仕様や XML との違いを説明することはしません。『Rubyist Magazine』にプログラマーのための YAML 入門 (初級編)という非常に優れた解説がありますので、そちらを参照してください。

次に示すのは、ハッシュ(連想配列)を表現する YAML コードの例です。

name: taro
email: taro@sample.com
age: 39

Ruby 言語で表現すれば、次のようになります。

{
  "name" => "taro",
  "email" => "taro@sample.com",
  "age" => 39
}

いま、この YAML データが RAILS_ROOT/tmp/taro.yml というファイルに書かれているとすれば、データを読み込んで、メールアドレスを表示するコードは次のようになります。

data = YAML.load_file(RAILS_ROOT + "/tmp/taro.yml")
puts data["email"]

とても簡単ですね。

ここまで分かれば、アクションの中で外部の YAML ファイルを読み込んで、テンプレートに渡すことができます。たとえば、 RAILS_ROOT/data/table1.yml というファイルがあって、そこに次のように書かれていたとします。

-
  name: taro
  email: taro@sample.com
  age: 39
-
  name: jiro
  email: jiro@sample.com
  age: 35
-
  name: saburo
  email: saburo@sample.com
  age: 31

そして、テンプレート show.rhtml がこんな風になっているとすると。

<table border="1" cellpadding="4">
  <tr>
    <th>名前</th>
    <th>メールアドレス</th>
    <th>年齢</th>
  </tr>
<% @records.each do |record| -%>
  <tr>
    <td><%= record['name'] %></td>
    <td><%= record['email'] %></td>
    <td><%= record['age'] %></td>
  </tr>
<% end -%>
</table>

show アクションは、こうなります。

class TablesController < ActionController
  def show
    id = params[:id]
    @records = YAML.load_file(RAILS_ROOT + "/data/table#{id}.yml")
  end
end

こうしておいてブラウザで http://localhost:3000/tables/show/1 にアクセスすれば、次のようなテーブルが表示される、というわけです。

名前メールアドレス年齢
tarotaro@sample.com39
jirojiro@sample.com35
saburosaburo@sample.com31

次回は、YAML よりも皆さんになじみ深い CSV ファイルについて説明します。Microsoft Excel データを CSV 形式経由で読み込んで、Web ページを生成してみましょう。