![]() ![]() ![]() ![]() RailsでWikiシステムを作成するこの記事のURLhttp://japan.internet.com/developer/20070731/26.html
著者:Anil Hemrajani
海外internet.com発の記事
はじめにRuby言語とRuby on Rails(略してRails)Webアプリケーションフレームワークは、ソフトウェアプログラミング業界に一大旋風を巻き起こしました。Rubyが登場してから10年以上が経ちますが、Railsフレームワーク自体は比較的新しいものです。しかし、非常に複雑なWebフレームワークの世界で悪戦苦闘している多くのプログラマに大変人気があります。この記事では、RubyとRailsを一緒に使うと、単純なWikiアプリケーションが簡単に作成できることを実証します。Railsは、データベースアプリケーションの作成に利用されるのが一般的ですが、この記事では、ファイルベースの永続化を説明します。というのは、私は個人的にファイルベースのWikiシステムの方が好きで、かつ、こちらの方がセットアップも簡単だからです。また、Railsを使ったデータベース以外のアプリケーション開発に関する情報はWeb上であまり公開されていないから、という理由もあります。なお、データベースへの切り替えは、Railsのデータベースサポートを使って手順どおりに行えば比較的簡単にできます。 必要なものこの記事の内容を理解するには、Ruby言語とRailsフレームワークに関する実用的な知識が必要です。そのどちらも初めての方は、既に公開されている次のDevXの記事をお読みください。
サンプルのwikiを作成して実行するには、中核となる次の3つのソフトウェアをインストールする必要があります。
本稿のWikiシステムの機能コードを確認する前に、本稿で作成するWikiシステム(名前は「RailsWiki」とします)の実装に必要な機能を検討してみましょう。一般的なWikiシステムでは、Webを介してコンテンツを簡単に追加、編集、削除できます。そこでRailsWikiでも、最低、次の操作ができるようにします。
システムの設計UIのレイアウトが決定したところで、次は、より技術的な面(アプリケーションの基本設計など)を検討してみましょう。図5に、RailsWikiアプリケーションの設計図を示します。RailsWikiでは一般的なモデルビューコントローラ(MVC)アーキテクチャを使用しますが、永続化の機能にファイルシステムを使用するという点がやや特殊です。ファイルベースの永続化スキームを採用したのは、前述の通り、できる限り単純なWikiシステムを作成するためです。Wikiの開発者のWard Cunningham氏も、Wikiのコンセプトは「必要最低限で動くシンプルさを追求すること」と言っています。アプリケーションのコーディングソフトウェアを適切にインストールしたら、RubyとRailsを使ってコーディングを開始します。Railsのすばらしさの1つは、新しくWebアプリケーションを開発するための叩き台となる数多くのコード、ディレクトリ、ファイルを生成してくれることです。RailsWikiのファイルを生成するには、まずこのアプリケーションの親ディレクトリとサブディレクトリを作成しようと考えているトップレベルディレクトリ(例: /users/anil/dev/、c:anildev)から、次のようなrailsコマンドを実行します。 > rails railswiki
コマンドとディレクトリの相対パス名について注記
以降のコマンドとディレクトリには、RailsWikiアプリケーションのトップレベルのディレクトリからの相対パスを示します。例えば、この場合のapp/views/は、c:anildev ailswikiappviewsなどを指していると考えてください。
コントローラとビューのスタブファイルの生成最初に作成(正確には「生成」)するのは、コントローラやそれぞれのビューに関するファイルです。Railsアプリケーションのトップレベルのディレクトリから、次のコマンドを入力して実行します。ruby script/generate controller Wiki index view edit print help
ruby script/server ここまでの作業で生成したコントロールとビューのスタブファイルにコードを追加する前に、まず、Wikiエンジンとして機能するモデルクラスを作成します。 "モデル"クラスを開発するRailsは、通常はバックエンドにデータベースを配置したWebアプリケーションの開発に使われるため、モデルとその関連ファイルを生成するときには、script/generateコマンドを使用するのが一般的です。しかし、今回のサンプルではファイルベースの永続化を使用するので、できる限りRailsの規則に従ってモデルクラスをゼロから作成します(リスト1を参照)。ここでは、app/modelsディレクトリにWikiモデルクラスを配置します(app/models/wiki.rb)。Railsでは、通常、生成されたモデルファイルはこの場所に配置されます。なお、メソッドの命名規則は、Railsから提供されるActiveRecord::Baseクラスに倣っています。リスト1に、完全なWikiモデルクラスを示します。リスト1 Wikiモデルクラス
require ’find’ basedir、find、find_wikis、saveです。これらのメソッドについて詳しく見てみましょう。
すべてのWikiファイルを格納する静的なディレクトリ(ベースディレクトリ)の名前を設定できます。このメソッドを呼び出さない場合は、クラス変数
@@basedirに指定されているように、デフォルトでカレントディレクトリが使用されます。Wikiファイル全体を読み込み、呼び出し元に文字列として返します(ファイルを読み込むのに
findというメソッド名は多少違和感があるかもしれませんが、Railsの命名規則に従ってこの名前を付けました。Railsの命名規則に従うことで、データベースの永続化モデルに切り替えるときも、Railsモデルのサポートを使って簡単に対応できます)。ベースディレクトリ内でクラス変数
@@extensionの値で終わるファイル名(この場合はデフォルトで".Wiki"に設定)を検索し、見つかったファイル名の配列を返します。ファイルを開き、メソッドパラメータ
contentのすべての内容をそのファイルに書き込みます。delete、exists?、attributesです。deleteメソッドはWikiファイルを削除します。exists?メソッドはWikiファイルが存在するかどうかを示します。attributesメソッドはファイルの属性(更新日やサイズなど)を取得します。モデルのコードの単体テストモデルのコードをコントローラクラスに挿入する前に、すべてのメソッドが期待どおりに動作するかを確認するために単体テストを実施します。通常、単体テストはメソッドを個別にテストする小規模なものが望ましいのですが、ここでは、複数のテストを単体テストファイル「test/unit/wiki_test.rb」内のtest_wikiという1つのメソッドにまとめて実施します。test_wikiメソッドでは、Wikiモデルクラスのsave、find、delete、exists?の各メソッドをテストします。以下に「wiki_test.rb」ファイルから抜粋したコードを示します。# Ensure file doesn’t exist (yet) まず、lib/tasksの下に拡張子.rakeで終わるファイルを配置する必要があります。これには、本稿のダウンロードファイルに含まれている「testing.rake」というファイルを使用します。このファイルには、次のRubyコードが含まれています。 Rake::Task[:’test:units’].prerequisites.clear ENV["RAILS_ENV"] = "test" Started モデル、ビュー、コントローラのコードを統合するWikiモデルクラスのコーディングとテストが完了したら、モデル、ビュー、コントローラのコードを統合します。リスト2に、WikiControllerクラスの完全なコードを示します(このクラスは「app/controllers/wiki_controller.rb」にあります)。リスト2 WikiControllerクラス
# This is the front/main controller for the Wiki application initialize、index、edit、view、print、help、create、delete、saveというpublicメソッドが含まれています。これらのメソッドの一部を詳しく見てみましょう。
Wikiファイルを格納するディレクトリ名を設定します。この名前は、「config/environment.rb」ファイルで
WIKI_DIRプロパティを介して構成されます。Wikiファイルを必要に応じて別の適切なディレクトリの下に保存したくなった場合は、この設定だけを変更すれば済みます。WIKI_DIR = "/tmp/railswiki" Wiki.find_wikisを呼び出して既存のWikiファイル名のリストを生成し、そのリストをインスタンス変数@filelistを介して「index.rhtml」ビューに渡します。このビューは、配列をループ処理し、処理結果をHTMLの<SELECT>ドロップダウンリストに設定します。<select name="f"> 単に
get_contentという内部(private)メソッドを呼び出すだけです。get_contentは、リクエストされたファイルを読み込み、そのファイルの属性と内容をそれぞれインスタンス変数@filestatと@contentを介して対応するビューに渡します。以下に使用例を示します。def get_content get_contentメソッドは、リクエストされたファイルの内容と属性を読み込む他に、ページをインデックスページにリダイレクトし、例外が発生した場合にはエラーメッセージを表示します。エラーメッセージは、Railsのflash機能(実体はアプリケーションエラーを格納するハッシュ)を使用して設定します。コントローラがビューにコントロールを渡すと、ビューは単にインスタンス変数 @contentの内容を表示します。例えば、「view.rhtml」テンプレートに含まれているファイル全体として1行しかないコードでは、Wikiファイルの内容を表示するだけでなく、表示する前に内容をto_htmlというヘルパーメソッドを使用して変換します。<%= to_html @content %> to_htmlヘルパーメソッドは、Railsが生成するヘルパーモジュール「app/helpers/wiki_helper.rb」ファイル内にあります(ヘルパーモジュールはビューで使用するメソッドを作成するのに便利です)。また、このファイルは、未加工のWikiファイルをHTMLに変換する手順を含み、前に説明したRedClothというgemの動作が開始する場所でもあります。以下に、「wiki_helper.rb」に含まれる、このコードの内容を示します。require ’redcloth’ その他の注目すべきファイル生成された「app/views/layouts/application.rhtml」ファイルは、アプリケーションレベルの(つまり全コントローラで使用可能な)一貫性のあるルックアンドフィールを提供し、ヘッダやフッタなどの要素を含んでいます。しかし、コントローラ固有のレイアウトを作成したい場合もあるはずです。そこでこのファイルの名前を「wiki.rhtml」に変更し、特定のWikiControllerにのみ適用されるようにしました。さらに、この「wiki.rhtml」ファイルをカスケーディングスタイルシート(CSS)ファイル「public/stylesheets/wiki.css」にもリンクさせました。これにより、色やフォントなどのアプリケーションの外観をCSSで制御できるようになります。さらに私が少々カスタマイズしたもう1つの生成ファイルは「config/routes.rb」です。マッピングの1つを変更し、生成された「public/index.html」ファイルを削除することで、行末のURI(/wiki/)を指定せずにインデックスページにアクセスできるようにしました。 map.connect ’’, :controller => "wiki" また、「config/routes.rb」ファイルに次の行を追加して、WebサービスのURLのように簡潔なREST(Representational State Transfer)を使用できるようにしました。 map.connect ’wiki/:action/:f’, :controller => "wiki" link_to、redirect_to、url_forなど)により自動処理されます。次のステップこれで正常に機能するWikiシステムが完成しました。しかし、この基本システムはまだ改良の余地があります。Railsをさらに学習したい方や、本稿のサンプルをとにかく改良してみようと思う方は、以下に挑戦してみてください。
参考資料著者紹介Anil Hemrajani(Anil Hemrajani)
20年に及ぶプログラミング歴を持つ。多くの記事や一般読者向けの本を執筆し、業界関連の賞を多数受賞。世界の4大陸で講演を行い、ある有名な開発者コミュニティを創設した経験を持ち、成功企業の経営にも携わる。現在は独立コンサルタントとして活動中。
|