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/でアクセスします。うまくいっていれば、つぎのようになるでしょう。

これは、何が起こっているかというと、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 を定義しています。

Keyword(s):
References:[RailsでWikiクローンを作る]