ショッピングカートアプリケーションの作成
Hello, Rails が動くようになったので、前回紹介した本の第6章に進み、いよいよ実際にDBと連携するショッピングカートアプリの作成に着手した。
depotプロジェクトの作成
まずは、「depot」という名前のプロジェクトを作る (懲りもせずMySQLを使用することに)。
rails -d mysql depot
このプロジェクトの開発のために、MySQL側で"depot_development"という開発用DBを予め作っておく (DB名は規約により左記のように定められる)必要があるが、RailsがCatalystと異なるのは、「データベースマイグレーション」という方法によって、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は余程「枯れてない」フレームワークのようだ。この書籍も説明が丁寧で分かりやすいけど、自分はCatalystやTurboGearsなどの他のフレームワークも経験して下地もあることだし、いきなり最新のマニュアル (Ruby on Rails Guidesとか)から始めた方がよさそうだ。