ショッピングカートアプリケーションの作成

Hello, Rails が動くようになったので、前回紹介した本の第6章に進み、いよいよ実際にDBと連携するショッピングカートアプリの作成に着手した。

depotプロジェクトの作成

まずは、「depot」という名前のプロジェクトを作る (懲りもせずMySQLを使用することに)。

rails -d mysql depot

このプロジェクトの開発のために、MySQL側で"depot_development"という開発用DBを予め作っておく (DB名は規約により左記のように定められる)必要があるが、RailsCatalystと異なるのは、「データベースマイグレーション」という方法によって、SQLを直接喋らなくてもテーブル定義とモデル作成が同時並行的にできること。以下のコマンドにより、productというモデルを作ると、このproductモデルはDBのproducts (複数形のsが付くことに注意)というテーブルに自動的にマッピングされる (その前に、config/database.yml のユーザ名やパスワードを確認しておくように)。

# ruby script/generate model product

上記ジェネレータにより、モデルそのものである"product.rb"と、マイグレーションの"タイムスタンプ_create_products.rb"などのファイルができる。後者を編集し、テーブルのカラムを定義するための文を追加する。

class CreateProducts < ActiveRecord::Migration
  def self.up
    create_table :products do |t|

      # ここから下の3行を追加
      t.column :title,          :string
      t.column :description,    :text
      t.column :image_url,      :string
      t.timestamps
    end
  end

  def self.down
    drop_table :products
  end
end

そして、

# rake db:migrate

を実行することにより、このマイグレーションを開発用データベースに適用すると、データベース (depot_development)にproductsテーブルが追加される (以下はその確認)。

mysql> use depot_development;
Database changed
mysql> show columns from products;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment | 
| title       | varchar(255) | YES  |     | NULL    |                | 
| description | text         | YES  |     | NULL    |                | 
| image_url   | varchar(255) | YES  |     | NULL    |                | 
| created_at  | datetime     | YES  |     | NULL    |                | 
| updated_at  | datetime     | YES  |     | NULL    |                | 
+-------------+--------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

DBとそれに接続するモデルクラスを作成したので、今度はコントローラを実装する番だ。以下のコマンドにより、adminという設定管理のためのコントローラクラスを作成。

# ruby script/generate controller admin

次に、admin_controller.rb に、以下の1文を追加する。

class AdminController < ApplicationController
    scaffold :product  # この1文を追加
end

「scaffold宣言は、実行時にアプリケーションのコードを生成するようRailsに指示し、:productパラメータはproductモデルを使ってデータを管理することを指定する」らしい。つまり、これでproductsテーブルのCRUDを一通り行うための「土台」ができた訳だ。

またしても動かん…

早速、

# ruby script/server

を叩いてWEBrickを起動した後、http://localhost:3000/admin にアクセスすれば、プロダクトの一覧が面画出ることに…なるはずだったが、またしてもエラーが発生!

undefined method `scaffold' for AdminController:Class

どうやら、Rails2.0からはデフォルトのデータベースがMySQLからsqliteになっただけではなく、scaffolding等のプラグインがデフォルトではインストールされなくなっているらしい。

これらの記事によると、scaffolding、pagination (ページング処理の管理)などのプラグインを順次インストールする必要があるようだ (しかも、その手順がかなり面倒そう!)。更に、Four Days on Rails 2.0という資料を読むと、Rails 2.0では、V1.2のようにモデル生成 (migrationファイルを生成) → DBにmigrate → scaffold生成という手順を踏むのではなく、いきなりscaffoldの生成を始めるようになっているらしい。具体的には、プロジェクト作成 (+DB作成)の後に、以下のようにscaffold ジェネレータを呼び出せばよい。

# ruby script/generate scaffold product title:string description:text image_url:string

これで、URL仕様は書籍で書いてあるのと異なるけど、ようやく「動くもの」が出来上がった。このように、Rails 2.0 からは、ソースコードを1行も編集することなく、(productsテーブルの)CRUD機能を持つアプリケーションを生成できる (確かに便利だ)。上記コマンド実行時の出力を見ると、migrationファイルが一緒に生成されているのがわかる。また、テンプレートファイルの拡張子が、rhtmlからhtml.erbに変更されていることにも気付いた。さらに、Rails 2.0以降では、REST (Representational State Transfer)の考え方が正式に取り入れられ、Rails 1.x とはScaffold で生成されるコードが大きく変わっているとのこと。

今読み進めている書籍は訳本の初版が2007年10月なので、さほど古くはないのだが、それでも動作仕様がガラリと変わってるので、Railsは余程「枯れてない」フレームワークのようだ。この書籍も説明が丁寧で分かりやすいけど、自分はCatalystTurboGearsなどの他のフレームワークも経験して下地もあることだし、いきなり最新のマニュアル (Ruby on Rails Guidesとか)から始めた方がよさそうだ。