SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

RailsでWikiシステムを作成する

Ruby on RailsによるWebアプリケーション作成の実例

ダウンロード サンプルソース (76.1 KB)

システムの設計

 UIのレイアウトが決定したところで、次は、より技術的な面(アプリケーションの基本設計など)を検討してみましょう。図5に、RailsWikiアプリケーションの設計図を示します。RailsWikiでは一般的なモデルビューコントローラ(MVC)アーキテクチャを使用しますが、永続化の機能にファイルシステムを使用するという点がやや特殊です。ファイルベースの永続化スキームを採用したのは、前述の通り、できる限り単純なWikiシステムを作成するためです。Wikiの開発者のWard Cunningham氏も、Wikiのコンセプトは「必要最低限で動くシンプルさを追求すること」と言っています。

図5 RailsWikiの設計図
図5 RailsWikiの設計図

アプリケーションのコーディング

 ソフトウェアを適切にインストールしたら、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/
コマンドとディレクトリの相対パス名について注記
 以降のコマンドとディレクトリには、RailsWikiアプリケーションのトップレベルのディレクトリからの相対パスを示します。例えば、この場合のapp/views/は、c:\anil\dev\railswiki\app\views\などを指していると考えてください。

コントローラとビューのスタブファイルの生成

 最初に作成(正確には「生成」)するのは、コントローラやそれぞれのビューに関するファイルです。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のような画面が表示されるはずです。

図6 スタブ「index.rhtml」の出力
図6 スタブ「index.rhtml」の出力

 ここまでの作業で生成したコントロールとビューのスタブファイルにコードを追加する前に、まず、Wikiエンジンとして機能するモデルクラスを作成します。

"モデル"クラスを開発する

 Railsは、通常はバックエンドにデータベースを配置したWebアプリケーションの開発に使われるため、モデルとその関連ファイルを生成するときには、script/generateコマンドを使用するのが一般的です。しかし、今回のサンプルではファイルベースの永続化を使用するので、できる限りRailsの規則に従ってモデルクラスをゼロから作成します(リスト1を参照)。ここでは、app/modelsディレクトリにWikiモデルクラスを配置します(app/models/wiki.rb)。Railsでは、通常、生成されたモデルファイルはこの場所に配置されます。なお、メソッドの命名規則は、Railsから提供されるActiveRecord::Baseクラスに倣っています。リスト1に、完全なWikiモデルクラスを示します。

リスト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

 このクラスで注目すべきメソッドは、basedirfindfind_wikissaveです。これらのメソッドについて詳しく見てみましょう。

  • basedirメソッド
  • すべてのWikiファイルを格納する静的なディレクトリ(ベースディレクトリ)の名前を設定できます。このメソッドを呼び出さない場合は、クラス変数@@basedirに指定されているように、デフォルトでカレントディレクトリが使用されます。
  • findメソッド
  • Wikiファイル全体を読み込み、呼び出し元に文字列として返します(ファイルを読み込むのにfindというメソッド名は多少違和感があるかもしれませんが、Railsの命名規則に従ってこの名前を付けました。Railsの命名規則に従うことで、データベースの永続化モデルに切り替えるときも、Railsモデルのサポートを使って簡単に対応できます)。
  • find_wikisメソッド
  • ベースディレクトリ内でクラス変数@@extensionの値で終わるファイル名(この場合はデフォルトで".Wiki"に設定)を検索し、見つかったファイル名の配列を返します。
  • saveメソッド
  • ファイルを開き、メソッドパラメータcontentのすべての内容をそのファイルに書き込みます。

 その他の注目すべきメソッドは、deleteexists?attributesです。deleteメソッドはWikiファイルを削除します。exists?メソッドはWikiファイルが存在するかどうかを示します。attributesメソッドはファイルの属性(更新日やサイズなど)を取得します。

次のページ
モデルのコードの単体テスト

この記事は参考になりましたか?

japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Anil Hemrajani(Anil Hemrajani)

20年に及ぶプログラミング歴を持つ。多くの記事や一般読者向けの本を執筆し、業界関連の賞を多数受賞。世界の4大陸で講演を行い、ある有名な開発者コミュニティを創設した経験を持ち、成功企業の経営にも携わる。現在は独立コンサルタントとして活動中。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1343 2007/06/04 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー