WebOS Goodies

WebOS の未来を模索する、ゲームプログラマあがりの Web 開発者のブログ。

WebOS Goodies へようこそ! WebOS はインターネットの未来形。あらゆる Web サイトが繋がり、共有し、協力して創り上げる、ひとつの巨大な情報システムです。そこでは、あらゆる情報がネットワーク上に蓄積され、我々はいつでも、どこからでも、多彩なデバイスを使ってそれらにアクセスできます。 WebOS Goodies は、さまざまな情報提供やツール開発を通して、そんな世界の実現に少しでも貢献するべく活動していきます。
Subscribe       

Ruby on Rails : Scaffold でお気楽データベースアプリ

前回の記事ではデータベースを使わずに簡単なWebアプリケーションを作成しましたが、いよいよ今回はデータベースのアクセスに挑戦してみたいと思います。Ruby on Rails には Scaffold という優れた機能があり、基本的なコードを自動作成してくれます。我々がやらなければいけないことは、データベースとテーブルを作成し、その名前などを Ruby on Rails に伝えてやるだけです。作業量だけで言えば、前回よりも少ないくらいかもしれません。

とは言うものの、まずはなにを作るか決めなければ話が始まりませんね。ちょうど blog の記事数が増えてきて管理が大変になってきたので、記事の管理ツールを作ってみようかと思います。別に大げさなものではなく、まずは記事のリストをデータベース化して、編集ページなどへのアクセスを容易にするものを目指します。さすがに今回だけでそれを完成させるのは無理があるので、数回に分けて Ruby on Rails の勉強をしつつ進めて行きたいと思います。このようなボトムアップ的開発手法が取りやすいのも Ruby on Rails の特徴のひとつですね(^^)

データベースの準備

アプリケーションの開発を始める前に、まずは必要なデータベースとユーザー、テーブルを作成しておきましょう。テーブルに関しては Ruby on Railsmigration という機能で作成することもできますが、説明することが増えるだけなのでここでは使いません(^^;。すべて mysql コマンドを使って手動で作成することにします。

なお、ここではデータベースエンジンとして MySQL の使用を前提とします。それ以外のデータベースエンジンを使用する場合は手順がまったく異なると思いますので、それぞれのマニュアルなどを参照してください。

テーブル構成の検討

実際にテーブルを作成する前に、テーブルのカラム構成を決めておきましょう。後からカラムを追加することも可能ですので、完全に練りこんでおく必要はありません。今回は、以下のような簡単なテーブル構成で始めようと思います。

カラム名 データ型 内容
id INT 固有 ID
number INT livedoor blog の記事 ID
title VARCHAR(200) 記事のタイトル

ここで Ruby on Rails でのカラム名の規則について簡単に説明しておきます。カラム名は上記のようにすべて英数小文字で記述し、各単語の間は "_"(アンダーバー)で区切ります。これを守ることで、各カラムが Ruby クラスのインスタンス変数に無理なくマッピングされます。また、各テーブルには "id" という名前の INT 型カラムが必須で、primary key でかつ auto_increment になっていなければなりません。この他にもいくつかルールやコツがありますが、それらは必要になったときにご紹介していきます。

データベースの作成

さて、まずは専用のデータベースを作成しましょう。Ruby on Rails では開発工程ごとに別々のデータベースを使うことが可能で、標準では開発・テスト・実稼動の 3 つのデータベースを指定するようになっています。しかし、個人利用ではちょっと大げさですよね。今回はすべてをひとつのデータベースで賄おうと思います。

データベースの名前にはとくに規則はありません。ここでは "blognavi" とでもしておきましょうか。以下のような SQL で作成できます。

CREATE DATABASE blognavi DEFAULT CHARACTER SET utf8;

日本語を扱うために、デフォルトのキャラクターセットを UTF-8 に設定している点に注意してください(GentooLinux では最近これがデフォルトになりました)。

ユーザーの作成

次にデータベースアクセスのためのユーザーを作成します。必要な権限は作成するWebアプリケーションによって異なりますが、以下の SQL で作成すればたいていは大丈夫でしょう。

GRANT SELECT,INSERT,UPDATE,DELETE,ALTER,CREATE,DROP,INDEX,LOCK TABLES
  ON blognavi.* TO 'blognavi'@'localhost'
  IDENTIFIED BY '<パスワード>';

パスワード はユーザーのパスワードに置き換えてください。

テーブルの作成

最後にテーブルを作成しましょう。テーブルの名前には以下のような規則があります。

  • 英数小文字で記述
  • 単語の間は "_"(アンダーバー)で区切る
  • 必ず複数形にする

最後の複数形ってのが新しいですね。Ruby on Rails 作者の David さんは、「テーブル名は複数形、クラス名は単数形であるべきだ」という哲学をお持ちだそうです。なんと不規則変化の名詞にもある程度対応するらしく、テーブル名が "people" ならクラス名は "Person" になります。日本人にとっては微妙に余計なお世話ですが、仕方ありませんね。英語の勉強だと思って我慢しましょう。

今回は blog 記事のテーブルなので、テーブル名は "articles" にしましょう。作成のための SQL は以下のようになります。

CREATE TABLE blognavi.articles (
  id     INT          NOT NULL AUTO_INCREMENT,
  number INT          NOT NULL,
  title  VARCHAR(200) NOT NULL,
  PRIMARY KEY (id)
);

Ruby on Rails による開発では外部キーを使う機会が多いので、MySQL では InnoDB 形式でテーブルを作るのが理想です。しかし、外部キーをきちんと使うのはいろいろと面倒ですし、スキーマの変更などに制約がでる場合もあるようです。今回の blognavi はどちらかというと Ruby on Rails の学習が目的なので、MyISAM 形式で統一することにします。もしどうしても必要になったら、その時点で InnoDB 形式に移行しても遅くはありません。

アプリケーションの作成

データベースの準備ができたところで、アプリケーションを作成しましょう。前回と同じく、rails コマンドを使用します。さらに、今回はデータベースの設定と日本語を使用するための設定もあわせてご紹介します。これらは Ruby on RailsWebアプリケーションの構築を始めるときに必ず行う作業だと思いますので、きっちり押さえておきましょう。

rails コマンドの実行

まずは rails コマンドでアプリケーションを作成しましょう。作成するディレクトリは "~/blognavi" とします。以下のコマンドを実行すれば OK です。

cd ~
rails blognavi

これで "~/blognavi" ディレクトリが作成され、必要なディレクトリ・ファイルがセットアップされました。

データベースの設定

先ほど作成したデータベースを使用するように Ruby on Rails を設定しましょう。ここは Ruby on Rails で唯一、設定が必要になるところです(データベースを使わなければ不要ですが)。データベースの設定は、"config/database.yml" で行います。今回の場合は、以下のように変更すればよいでしょう。

development:
  adapter: mysql
  database: blognavi
  username: blognavi
  password: <パスワード>
  socket: /var/run/mysqld/mysqld.sock
  encoding: utf8

test:
  adapter: mysql
  database: blognavi
  username: blognavi
  password: <パスワード>
  socket: /var/run/mysqld/mysqld.sock
  encoding: utf8

production:
  adapter: mysql
  database: blognavi
  username: blognavi
  password: <パスワード>
  socket: /var/run/mysqld/mysqld.sock
  encoding: utf8

開発、テスト、実稼動すべてで同じデータベースを使用するため、3 つともまったく同じ設定にしています。また、日本語を正しく処理するために "encoding: utf8" の行をそれぞれに追加しました。使用するデータベースエンジンによっては追加の設定が必要な場合もありますので、ご注意ください。

$KCODE の指定

日本語を正しく扱うために、Ruby のグローバル変数 "$KCODE" を設定しましょう。問題はどこで設定するかですが、RailsによるアジャイルWebアプリケーション開発では "config/environment.rb" の先頭を勧めています。ここでもそれにならって、"config/environment.rb" の先頭に以下の行を追加しておきます。

$KCODE = "UTF8"

なお、EUC-JP や SJIS の使用も可能かもしれませんが、あまりお勧めできません。必要に応じて Ruby 内でコード変換するのが良いのではないでしょうか。

Content-Type の設定

Web ブラウザが文字コードを誤認識しないように、HTTP ヘッダの Content-Type で文字コードを指定するようにしましょう。そのためには、"app/controllers/application.rb" を以下のように変更します。

class ApplicationController < ActionController::Base
  before_filter :set_charset
 
  private
 
  def set_charset
    headers['Content-Type'] = 'text/html; charset=UTF-8'
  end
end

詳細はここでは省きますが、「フィルタ」という機能を利用して HTTP ヘッダを変更しています。ApplicationController クラスはすべてのコントローラの基底クラスとして使用されるので、ここでの設定はすべてのコントローラに適用されます。

以上でアプリケーションが作成され、日本語を使う準備もできました。必要に応じてサーバーを起動して動作確認してみてください。

Scaffold を作成する

いよいよ本日のメインイベント、Scaffold でデータベースを操作する Web ページを自動生成してみましょう。Scaffold は "generate" スクリプトで作成します。書式は以下のようになっています。

ruby script/generate scaffold <モデル名> <コントローラ名>

コントローラ名前回の記事で "generate controller" スクリプトを実行したときと同じ意味です。モデル名はデータベースのテーブルに対応する Ruby クラスの名前で、テーブル名に以下の規則を適用したものにします。

  1. 各単語の頭文字を大文字にする
  2. 単語区切りの "_"(アンダーバー)を削除する
  3. 単数形にする

こうすることで Ruby on Rails がデータベース内のテーブルとクラスを自動的に結び付けてくれます。今回はモデルクラスを "Article"、コントローラは "ArticleController" としておきましょう。この場合、実行するコマンドは以下のようになります。

cd ~/blognavi
ruby script/generate scaffold Article Article

以上、Scaffold の作成は終了です!ここまでの準備に比べると、あっけないくらいですね。さあ、以下のコマンドを実行して Web サーバーを起動し、さっそくアクセスしてみましょう。

ruby script/server

まずは "http://localhost:3000/article" にアクセスしてください(もし他のホストから接続する場合は、適宜 URL を読み替えてください)。以下のようなページが表示されるはずです。

Scaffold のトップページ

ここで "New article" のリンクをクリックすると、以下のページに移動します。なんと、先ほど作成したテーブルに対応した入力フォームがちゃんと表示されていますね。

新規アイテム作成ページ

ではフォーム内容を適当に入力し、「Create」ボタンをクリックしてください。入力したデータがリスト表示されます。「Show」、「Edit」、「Destroy」のリンクも設置されていますね。

アイテムリストページ

それぞれのリンクもちゃんと機能します。まずは「Show」の画面。

アイテム表示ページ

とても素っ気無いですが、「Edit」のリンクが設置されているのは気が利いてますね。次は「Edit」の画面。先ほどの「New article」とほぼ同じです。

RoR Scaffold のアイテム編集ページ

「Destroy」は今のところ JavaScript の確認ダイアログだけなのでスクリーンショットは省きますが、削除の機能はきちんと動作します。

いかがでしょう。さすがに見た目は標準のスタイルそのままでイケてませんが、たったこれだけの手間で基本的なインターフェースが動作してしまうのは驚きですね。Scaffold は名前のとおり「足場」ですから、これをベースに拡張していくことで望みの機能を実現していくわけです。そしてその過程でも Ruby on Rails の優れたサポート機能により、極めて少ないコーディングで多くの機能が実現できます。今後の記事でそのあたりをガンガン紹介していく予定ですので、どうかご期待ください!(^^)

関連記事

この記事にコメントする

Recommendations
Books
「Closure Library」の入門書です。
詳しくはこちらの記事をどうぞ!
Categories
Recent Articles