システムの設計
UIのレイアウトが決定したところで、次は、より技術的な面(アプリケーションの基本設計など)を検討してみましょう。図5に、RailsWikiアプリケーションの設計図を示します。RailsWikiでは一般的なモデルビューコントローラ(MVC)アーキテクチャを使用しますが、永続化の機能にファイルシステムを使用するという点がやや特殊です。ファイルベースの永続化スキームを採用したのは、前述の通り、できる限り単純なWikiシステムを作成するためです。Wikiの開発者のWard Cunningham氏も、Wikiのコンセプトは「必要最低限で動くシンプルさを追求すること」と言っています。
アプリケーションのコーディング
ソフトウェアを適切にインストールしたら、RubyとRailsを使ってコーディングを開始します。
Railsのすばらしさの1つは、新しくWebアプリケーションを開発するための叩き台となる数多くのコード、ディレクトリ、ファイルを生成してくれることです。RailsWikiのファイルを生成するには、まずこのアプリケーションの親ディレクトリとサブディレクトリを作成しようと考えているトップレベルディレクトリ(例: /users/anil/dev/、c:\anil\dev)から、次のようなrailsコマンドを実行します。
> rails railswiki
railsコマンドが適切に実行されると、多数のディレクトリとファイルが作成されます。この記事で使用するディレクトリの一部を以下に示します。
- app/controllers/
- app/models/
- app/views/
- app/helpers/
- public/stylesheets/
- test/unit/
- config/
- script/
コントローラとビューのスタブファイルの生成
最初に作成(正確には「生成」)するのは、コントローラやそれぞれのビューに関するファイルです。Railsアプリケーションのトップレベルのディレクトリから、次のコマンドを入力して実行します。
ruby script/generate controller Wiki index view edit print help
generateコマンドを実行すると、いくつかのファイルが作成されます。その一部を以下に示します。
- app/controllers/wiki_controller.rb
- app/views/layouts/application.rhtml
- app/views/wiki/edit.rhtml
- app/views/wiki/help.rhtml
- app/views/wiki/index.rhtml
- app/views/wiki/print.rhtml
- app/views/wiki/view.rhtml
この時点で、動作するWebアプリケーションが既にできています。このスタブアプリケーションをテストするには、次のコマンドを実行して、組み込みのWEBrick HTTPサーバーを起動します。
ruby script/server
Webサーバーが起動したら、Webブラウザで「http://localhost:3000/wiki/」を開きます。図6のような画面が表示されるはずです。
ここまでの作業で生成したコントロールとビューのスタブファイルにコードを追加する前に、まず、Wikiエンジンとして機能するモデルクラスを作成します。
"モデル"クラスを開発する
Railsは、通常はバックエンドにデータベースを配置したWebアプリケーションの開発に使われるため、モデルとその関連ファイルを生成するときには、script/generateコマンドを使用するのが一般的です。しかし、今回のサンプルではファイルベースの永続化を使用するので、できる限りRailsの規則に従ってモデルクラスをゼロから作成します(リスト1を参照)。ここでは、app/modelsディレクトリにWikiモデルクラスを配置します(app/models/wiki.rb)。Railsでは、通常、生成されたモデルファイルはこの場所に配置されます。なお、メソッドの命名規則は、Railsから提供されるActiveRecord::Baseクラスに倣っています。リスト1に、完全なWikiモデルクラスを示します。
require 'find' # This is the core/manager class for the Railswiki application # Author: Anil Hemrajani # Date: Feb, 2007 class Wiki @@basedir = "." @@extension = "wiki" def self.basedir(basedir) @@basedir = basedir end # check if file exists def self.exists?(basefilename) File.file?(getfullpath(basefilename)) end # get file stat def self.attributes(basefilename) File.stat(getfullpath(basefilename)) end # delete existing wiki file def self.delete(basefilename) File.delete(getfullpath(basefilename)) end def self.file_extension @@extension end # save raw wiki file contents def self.save(basefilename, content) mkdir file = File.open(getfullpath(basefilename), 'w') begin file.print content ensure file.close end end # return array of wiki file names in basedir # get raw wiki file contents def self.find(basefilename) #unless (FileTest.file?(basefilename)) return "File not found." getline = "" File.open(getfullpath(basefilename), 'r') do |f1| while line = f1.gets getline = getline + line end end getline end # Get list of file names ending with @@extension def self.find_wikis() files = [] Find.find(@@basedir) do |path| if File.file?(path) && path =~ /.#{@@extension}$/ files << File.basename(path, ".#{@@extension}") end end files end private def self.mkdir() Dir.mkdir(@@basedir) if !File.exist?(@@basedir) end def self.getfullpath(basefilename) @@basedir + "/" + getfullname(basefilename) end def self.getfullname(basefilename) basefilename + "." + @@extension end end
このクラスで注目すべきメソッドは、basedir、find、find_wikis、saveです。これらのメソッドについて詳しく見てみましょう。
- basedirメソッド
- findメソッド
- find_wikisメソッド
- saveメソッド
@@basedirに指定されているように、デフォルトでカレントディレクトリが使用されます。findというメソッド名は多少違和感があるかもしれませんが、Railsの命名規則に従ってこの名前を付けました。Railsの命名規則に従うことで、データベースの永続化モデルに切り替えるときも、Railsモデルのサポートを使って簡単に対応できます)。@@extensionの値で終わるファイル名(この場合はデフォルトで".Wiki"に設定)を検索し、見つかったファイル名の配列を返します。contentのすべての内容をそのファイルに書き込みます。 その他の注目すべきメソッドは、delete、exists?、attributesです。deleteメソッドはWikiファイルを削除します。exists?メソッドはWikiファイルが存在するかどうかを示します。attributesメソッドはファイルの属性(更新日やサイズなど)を取得します。


