FrontPage  Index  Search  Changes  Login

RailsでWikiクローンを作る01

準備段階

Wikiクローン Minki

まずはアプリケーションの名前を決めます。ここではMinkiとしてみました。 Minimal Wikiの略という程度の意味です。 Minkiは、Hikiを手本にして、ごく 基本的なWikiの機能をもたせることにします。ページの表示、新規作成、編集 などはもちろんできるものとしますが、プラグインなどの機能は省略します。 tDiaryのテーマには対応させたいと思います。

MVCとRailsアプリケーション

Railsは、MVCという設計モデルに基づいてアプリケーションを作成します。 MVCとは、Model、View、Controllerの三要素でソフトウェアを実装する方式で、 最近のWebアプリケーションフレームワークの多くがこの方式を採用していま す。MVCの各要素の役割は以下のとおりです。

モデル(model)
アプリケーションの状態を司る。単なるデータではなく、そのデータを扱うロジックも含む。
ビュー(view)
表示・出力を司る。
コントローラ(controller)
入力を受け取って、model, viewを制御する。

コントローラが入力を受け取り、モデルとやり取りをして、表示内容をビュー に渡し、ビューが画面表示を行う、という流れです。

Railsの場合、コントローラが扱う入力は、ブラウザを経由してやってくるユー ザからのリクエストです。その URL によって、コントローラの中のメソッド が(場合によってIDやパラメータつきで)呼び出されます。そのメソッドをアク ションといいます。

例えば Minkiでは、Wikiページの表示を行うときは以下の URL にアクセスします。

http://railshost/wiki/show/FrontPage

上記の URL 中で、wiki の部分がコントローラ名、showがアクション名で、最 後の FrontPageがアプリケーション内部で使用するIDです。細かいことは後程 説明しますが、このURLにアクセスすると、Railsアプリの WikiControllerと いうクラスの show というメソッドが FrontPageというパラメータ(ID)をつけ て呼び出されます。 (注: 多くの Rails 関連のサンプルでは、上記の ID の部分はほとんどの場合 数字になっています。その数字はDBテーブルのidカラムに直接対応しています。 しかしWikiアプリケーションでは数字よりもページ名で扱うのが都合が良いた め、ページ名をIDとしています)

コントローラは、必要に応じてモデルとやりとりします。モデルはデータを保 持しアプリケーションの状態を司る部分ですが、そのデータは一般的にリレー ショナルデータベース(DB)に保持します。 Railsには、ActiveRecordという O/Rマッパがあり、ActiveRecordを通じてDBにアクセスすることになります。 ActiveRecordがDBへのアクセスを抽象化してくれるので、Rubyからは(あまり) DBを意識せずに扱えます。さきほどの例で言うと、wikiコントローラのshowメ ソッドは、モデルに FrontPageという名前のデータレコードを要求します。そ して、そのページ内容やページタイトルを受取り、次のビューへと渡します。

ビューは表示を司る部分です。Railsの場合は、Rubyに標準添付のERBというテ ンプレートエンジンを使用します。アクションとビューは対応しており、例え ば show アクションに対応するビューのテンプレートは show.rhtml になりま す。そしてテンプレートエンジンによって、コントローラから来るデータとテ ンプレートに基づいて最終的な HTML が生成され、ユーザのブラウザに出力さ れます。ここではERBそのものについては説明しませんので、別途rubyのリファ レンスマニュアル等を参照してください。

Railsのインストール

RailsのInstall あるいはRails公式サイトのダウンロードページあたりを参照。

アプリケーション初期状態の作成

では、早速 Minki アプリケーションをつくり始めることにします。まずはアプリケーションを作成するディレクトリを決め、そこで以下のコマンドを実行します。

% rails minki

すると、ずらずらとメッセージが表示されて、minkiの下にいくつかのディレクトリやファイルが生成されます。ここで生成されるディレクトリの意味は以下の通りです。

app
このディレクトリのサブディレクトリに、モデル、ビュー、コントローラのプログラムが置かれる。初期状態ではほとんど空っぽに近い。開発時に新規作成/編集するファイルの大半はここに置かれることになる。
components
再利用可能なコンポーネントを置く。minkiでは使用しない。
config
設定ファイル置き場。データベースへの接続情報など。
db
データベースのスキーマ情報や、SQLiteの場合はデータベースファイルそのものを置く。初期状態では空っぽ。
doc
アプリケーションのドキュメントを置く。
lib
ライブラリ置き場。minkiでは使用しない。初期状態では空っぽ。
log
ログが書き出される場所。
public
webでアクセスされるディレクトリ。アプリケーションのDocumentRootとなる。
script
ユーティリティスクリプト群。
test
テスト時に使うディレクトリ。
vendor
サードパーティ製ライブラリ置き場。初期状態では空っぽ。minkiでは使用しない。

Rails アプリは、最終的には Apache や lighttpd などの webサーバで動作させることになるでしょうが、開発時は WEBrickをベースにしたRails付属のwebサーバを使うのが手っ取り早いです。以下のようにして、webサーバを起動します。

% cd minki
% ruby script/server

これで、そのマシンのポート3000番でwebサーバが立ち上がります。同一ホストのブラウザで確認するならhttp://localhost:3000/、別マシンのブラウザで確認するなら、開発マシンの名前をrailshostとすると、http://railshost:3000/でアクセスします。うまくいっていれば、つぎのようになるでしょう。

congratulation

これは、何が起こっているかというと、minkiのpublicディレクトリにあるindex.htmlが表示されているだけです。つまり、publicディレクトリがdocument root になります。

データベースの準備

アプリケーションのディレクトリができたら、次はデータベースの準備をしま す。ここではDBとして、RailsがサポートしているDBエンジンのひとつである SQLite(Ver.3系)を使用します。 RailsでSQLiteを使うには、 HowtouseSQLite を見てください (FreeBSDで使う場合はSQLiteインストールも参照)。

さて、Wikiを実装するにあたり、まずはページ情報を保持するデータベーススキーマを決めます(後程、Minkiの設定情報やユーザ情報を管理するテーブルを追加しますが、今はページのテーブルだけ作ります)。

-- page
create table pages (
  id                    integer primary key,
  name                  varchar(255) not null,
  title                 varchar(255),
  freezeflag            boolean,
  updated_at            datetime,
  content               text
);
create index pagename on pages(name);

それぞれのカラムの意味は以下の通りです。

id
プライマリキー。連番の数字。SQLiteでは integer primary key と書くと auto increment される。
name
ページの名前。
title
ページのタイトル。名前とは別にタイトルをつけたい場合に使う。
freezeflag
freezeフラグ。Wikiのページは通常誰でも編集可能だが、freezeすると凍結され解除するまで編集不可となる。
updated_at
ページが更新された時刻を保持する。 Railsマジックによって、updated_atという名前でdatetime型のフィールドには、明示しなくてもレコードを更新したとき自動的にその時刻が入るようになる。
content
ページ内容。Wikiソースそのものが入る。

Railsにおいて、データベースのスキーマの設計にはいくつかの取り決めがあ ります。まずテーブル名は名詞の複数形にします。そして、テーブルの primary key に id という名前のフィールドが必要です。これらの規則は変更 することも可能ですが、素直に従っておいたほうが無難です。

SQLiteのデータベースファイルは、アプリケーションディレクトリのdbという ディレクトリに保存します。ここではminki.dbという名前にします。まず、先 ほどのスキーマを db/schema-sqlite.sqlというファイルに保存します。そし て、コマンドラインから

% cd db
% sqlite3 minki.db < schema-sqlite.sql

のようにすると、minki.db というファイルが作成されます。

development, production, test 環境

Railsには、アプリケーション実行時の環境として、development, production, test 環境の三つが想定されています。それぞれの環境で接続す るデータベースを変えたり、その他の設定を変えたりすることができます。

developmentは開発環境で、script/server を使って動かしている状態はこの 環境です。 productionは本番稼働の環境で、test はテスト用の環境です。そ れぞれは、環境変数 RAILS_ENV で指定します。デフォルトは 'development' です。

ここでは、当分 development 環境なので、development環境のデータベースの み設定します。データベースの設定は config/database.yml で行います。 Railsにおいて設定ファイルらしい設定ファイルはこれだけです。 このファイルには、あらかじめいろいろサンプル設定が書いてありますが、バッ サリ削っておきましょう。

development:
  adapter: sqlite3
  dbfile: db/minki.db

adapter: に sqlite3 を指定(「3」を忘れないこと)し、 dbfile: でデータベースファイルのパスを指定します。

なお、もしも開発途中にdatabase.yml を書き換えるようなことがあったら、 必ず script/server を再起動しましょう。

UTF-8 で運用する

Minki では日本語を扱いたいので、Rails を UTF-8 で運用することにします。やり方については、utf-8で運用するを参照してください。以下の二つのファイルをいじります。

config/environment.rb
app/controller/application.rb

config/environment.rbはアプリケーション起動時に実行されるファイルです。app/controller/application.rb は、すべてのコントローラの上位クラスになる ApplicationController を定義しています。

Last modified:2005/11/27 11:20:17
Keyword(s):
References:[RailsでWikiクローンを作る]