scaffoldでひな型ソースコードを自動生成
Railsには、「scaffold」(スキャフォゥド:「足場」という意味)という大変便利な機能があります。scaffoldを使うと、特定のデータ(例えば、今回のサンプルでいえば「カテゴリ」)の以下の一連の操作を行うための画面やその裏側の処理を行うプログラムを自動生成できます。
- 新規作成画面
- 一覧表示画面
- 詳細表示
- 修正画面
- 削除画面
scaffoldを実行
今回のサンプルは「カテゴリの詳細表示画面」の1画面しかありませんが、scaffoldを使って自動生成させて、不要な画面やプログラムロジックを削除する、という方法を取った方が効率的ですし、Railsの規約に沿ってアプリケーションを構築できます。
では、早速scaffoldを実行してみましょう。
$./script/generate scaffold category name:string description:text
「script/generate scaffold」以降がscaffoldの引数です(scaffoldの利用方法は「./script/generate scaffold -h」で確認できます)。
第1引数「category」で、カテゴリに対する一連の画面を作成することを指示しています。第2引数以降は、categoryが持つ属性を指定しています。今回はカテゴリの属性として以下を指定しました。
- カテゴリ名(name)
- カテゴリ説明文(description)
scaffoldの実行結果を確認
scaffoldを実行すると、次のような結果が表示されます。
exists app/models/ exists app/controllers/ exists app/helpers/ create app/views/categories …【略】…
各行は次のような意味です。
- exists:すでに存在していなかったので何もしなかった
- create:新しくファイルやディレクトリを作成した
次のファイルが生成されていることに注目してください。
- Categoryクラス(MVCの「M」)app/models/category.rbapp/models/category.rb
- カテゴリの新規追加や修正などの各画面のテンプレート(MVCの「V」)app/views/categories/index.html.erb
app/views/categories/show.html.erb
app/views/categories/new.html.erb
app/views/categories/edit.html.erb
app/views/layouts/categories.html.erbapp/views/categories/index.html.erb
app/views/categories/show.html.erb
app/views/categories/new.html.erb
app/views/categories/edit.html.erb
app/views/layouts/categories.html.erb - CategoriesControllerクラス(MVCの「C」)
app/controllers/categories_controller.rbapp/controllers/categories_controller.rb - カテゴリ情報を登録するテーブルの追加
db/migrate/20080728204433_create_categories.rb(「20080728204433_create_categories.rb」は、実行日時によってファイル名が異なります)db/migrate/20080728204433_create_categories.rb(「20080728204433_create_categories.rb」は、実行日時によってファイル名が異なります) - データベースのサンプルデータ
test/fixtures/categories.ymltest/fixtures/categories.yml
「カテゴリ」テーブルを作成
scaffoldで作成されたアプリケーションの動作確認をするに当たり、データベースの設定をしましょう。
まず、今回サンプルで表示されるカテゴリ情報を格納するテーブルをデータベース上に作成します。scaffoldが作成した「db/migrate/20080728204433_create_categories.rb」のファイルを見てみると、次の記述が見つかります。
create_table :categories do |t| t.string :name t.text :description t.timestamps end
Ruby言語なので、連載「パターンとライブラリで作るAjaxおいしいレシピ」の読者にはちょっと見慣れない記述ですね(Rubyではファイルの拡張子は「.rb」です)。上記はJavaScript流に書くと、以下のような記述になります。
create_table('categories', function(t) { t.string('name'); t.string('description'); t.timestamps; })
Rubyではメソッド呼び出しの「()」(括弧)を省略できます。doは、ブロック付きメソッド呼び出しです(参考)。「:文字列」はシンボルリテラルです(参考)。
これは、「DBに以下のテーブルを作成せよ」というcreate_table()メソッド(参考)の呼び出しです。
カラム名 | 型 |
---|---|
name | varchar(255) |
description | text |
表1 「categories」テーブルの構成 |
このプログラムはRailsが用意している「マイグレーション」というDBへの変更をバージョン管理する仕組みの中で実行されます。
マイグレーションの仕組み
マイグレーションとは、次のような仕組みです。
- db/migrateディレクトリ配下にdb/migrate/20080728204433_create_categories.rbのように、DBに対する変更内容が記述されたファイルを配置
- このとき、各ファイル名の先頭には「20080728204433」の部分のように、タイムスタンプに基づくバージョン情報が付く
- マイグレーションは現在のDBのバージョン情報を保持する。これにより、db/migration内のファイルのうち、どれがDBに反映されて、どれが反映されていないかが分かる
- 「db:migrate」というrakeタスク(「make install」のようなバッチ処理をイメージすると分かりやすい)を実行して、未反映の変更をDBに反映させることができる(=最新状態までバージョンアップ)
- または、バージョン情報を指定してrakeタスクを実行し、バージョンを任意のバージョンにバージョンアップ、バージョンダウンさせることもできる
マイグレーションの実行
それでは、マイグレーションを利用して「カテゴリ」テーブルを作成してみましょう。rakeタスク「db:migrate」を実行することでマイグレーションを使うことができます(railsが提供するrakeタスク一覧は、「rake -T」で確認できます)。
まず、現在のバージョンを「db:version」というrakeタスクで確認しましょう。
$ cd rails開発環境ディレクトリ $ rake db:version (in /home/staff/shida/public_html/rails/rjs_tutorial) Current version: 0
現在のバージョンは「0」です。では、マイグレーションを実行します。
$ rake db:migrate (in /home/staff/shida/public_html/rails/rjs_tutorial) == 20080728210624 CreateCategories: migrating =========================== -- create_table(:categories) -> 0.0250s == 20080728210624 CreateCategories: migrated (0.0252s) ==================
これで、現在のバージョンは「20080728210624」になりました。SQLiteのDBファイルがなければ、自動的に作成されます。
db/development.sqlite3
これで、カテゴリテーブルが作成されました。SQLiteを使用してテーブルを確認してみましょう(実行結果は分かりやすいようにインデントしてあります)。
$ sqlite3 db/development.sqlite3 sqlite> .schema categories CREATE TABLE "categories" ( "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255) DEFAULT NULL NULL, "description" text DEFAULT NULL NULL, "created_at" datetime DEFAULT NULL NULL, "updated_at" datetime DEFAULT NULL NULL );
主キーとなる「id」や、登録日付「created_at」や更新日付「updated_at」といったカラムが自動で追加されています。マイグレーションの詳細に興味があるなら、こちらを参照してください。
「カテゴリ」のデータを登録
「カテゴリ」テーブルが作成できたら、そのテーブルに次のようなサンプルデータを登録しましょう。
カテゴリ名 | 説明文 |
---|---|
猫Tシャツ | 猫の写真をTシャツにあしらった当店の人気シリーズです |
犬Tシャツ | かわいいわんちゃんの写真をあしらったTシャツです |
動物Tシャツ | さまざまな動物の写真をあしらったTシャツです |
表2 サンプルデータ |
RailsはFixtureというサンプルデータを登録する仕組みを持っています。Fixtureは、YAML形式(データ形式の一種)、CSV形式、Single-file形式をサンプルデータのファイル形式としてサポートしています。今回はscaffoldが自動生成したカテゴリテーブル用YAMLファイル「test/fixtures/categories.yml」を使い、次のように記述しました。
neco: name: 猫Tシャツ description: 猫の写真をTシャツにあしらった当店の人気シリーズです dog: name: 犬Tシャツ description: かわいいわんちゃんの写真をあしらったTシャツです animal: name: 動物Tシャツ description: さまざまな動物の写真をあしらったTシャツです
各レコードの識別子として「neco」「dog」「animal」と名前を付けています。この識別子は、次回の連載記事で商品のサンプルデータを登録する際に、商品がひも付くカテゴリを指定するために使用します。レコードの各カラムの値は、スペース2つ分インデントして、各カラム名の後ろに「:」を付けて、その後に指定します。IDや登録日付などは指定しなければ、Railsが自動で値を設定してくれます。
サンプルデータをcategories.ymlに登録したら、rakeタスク「db:fixtures:load」でカテゴリテーブルに登録します。
$ rake db:fixtures:load
Fixtureの詳細に興味があるなら、こちらを参照してください。
Copyright © ITmedia, Inc. All Rights Reserved.