«前の日記(2006-09-30 (土)) 最新 次の日記(2006-10-03 (火))»  

まちゅダイアリー


2006-10-02 (月)

Rails に(再)挑戦

Rails本を買ってから半年が経つのに、全然 Rails を使ってない。 少し時間が出来たので、 Rails に再挑戦してみた。 試しに何かを作るのが一番!ということで、 ninjin さんの RandomNote を Rails で作ってみる。 なぜ RandomNote かというと、 Wiki よりは実装が楽そうだから…ってのもあるけど、できれば自分で使いたいから。

ちなみに、調べてみると Rails で Wiki を作った記録を残してあるサイトがいくつかあった。 よく整理されていて分かりやすいな…。

ここまで綺麗には整理できないだろうけど、自分で試行錯誤した記録を残してみるよ。

Rails のセットアップ

環境は VMware 上で動かしている Debian Sarge を使う。 まずは Rails のセットアップからおさらい。

$ sudo aptitude install ruby ruby-dev ri irb libopenssl-ruby
$ wget http://rubyforge.org/frs/download.php/5207/rubygems-0.8.11.tgz
$ tar zxvf rubygems-0.8.11.tgz
$ cd rubygems-0.8.11
$ sudo ruby setup.rb
$ sudo gem install rails

$ sudo aptitude install sqlite3 libsqlite3-dev
$ sudo gem install sqlite3-ruby

データベースはセットアップが楽な SQLite3 を使う。 本体は Debian パッケージでインストールし、 Ruby バインディングは RubyGems を使ってインストールした。 「libsqlite3-dev」が無いと sqlite3-dev は入らないので注意。

プロジェクトの作成

セットアップが終わったら、いよいよプロジェクトを作る。 プロジェクト名は RandomNote の頭文字を取って rn とした。

$ rails -d sqlite3 rn
$ cd rn

-d オプションでデータベース (sqlite3) を指定している。 これで、 config/database.yml のテンプレートが sqlite3 のものになる。 参考までに、ファイルの中身は以下の通り。特に修正する必要はなさそう。

development:
  adapter: sqlite3
  database: db/development.sqlite3

test:
  adapter: sqlite3
  database: db/test.sqlite3

production:
  adapter: sqlite3
  database: db/production.sqlite3
Tags: Ruby Rails

model と scaffold を作る

さて、どうやって進めていくかだけど…。 Rails を理解していない(理解することが目的)から、ストレートで完成にたどり着くのは難しい。 だとしたら、少し作って動かして…の繰り返しで進めるのがよさそう。 ということで、最初に定番の scaffold (足場)を作って、そこから少しずつ手を加えることにする。

RandomNote は、 Wiki と違ってページ同士の結びつきが緩い。 特徴である検索は後で考えることにして、まずはページの作成・編集が出来ることを目標にしよう。

作成するものは以下の通り。ほとんどが雛形を自動生成してくれる。

  • モデル
  • モデルに対応するデータベースのテーブル
  • コントローラ
  • ビュー

model の作成

script/generate を使って、モデル(Page クラス)を作成する。

$ script/generate model Page
      exists  app/models/
      exists  test/unit/
      exists  test/fixtures/
      create  app/models/page.rb
      create  test/unit/page_test.rb
      create  test/fixtures/pages.yml
      create  db/migrate
      create  db/migrate/001_create_pages.rb

いきなり scaffold を作らずに model だけ作ったのは、 scaffold だとデータベースのマイグレーションファイル (db/migrate/001_create_pages.rb) を作ってくれなかったから。 ちなみに、マイグレーションファイルだけ作りたい時は、「script/generate migration CreatePages」とすればいい。

マイグレーションファイルを開いて、テーブルのスキーマを定義する。 とりあえずは、ページに本文 (body) だけあればいい。 更新日付などは後で足していこう。

$ vi db/migrate/001_create_pages.rb
class CreatePages < ActiveRecord::Migration
  def self.up
    create_table :pages do |t|
      t.column :body, :text
    end
  end

  def self.down
    drop_table :pages
  end
end

マイグレーションファイルが出来ると、 rake コマンドを使ってデータベースへと反映させる。

$ rake migrate

sqlite3 コマンドを使って、データベースにテーブルが作成されていることを確認する。

$ sqlite3 db/development.sqlite3
sqlite> .tables
pages        schema_info
sqlite> .schema pages
CREATE TABLE pages ("id" INTEGER PRIMARY KEY NOT NULL, "body" text);

うん。正しく作成されているみたい。

scaffold の作成

model が出来たので、それを操作・表示するための足場 (scaffold) を生成する。

$ script/generate scaffold Page Note
      exists  app/controllers/
      exists  app/helpers/
      create  app/views/note
      exists  test/functional/
  dependency  model
      exists    app/models/
      exists    test/unit/
      exists    test/fixtures/
   identical    app/models/page.rb
   identical    test/unit/page_test.rb
   identical    test/fixtures/pages.yml
      create  app/views/note/_form.rhtml
      create  app/views/note/list.rhtml
      create  app/views/note/show.rhtml
      create  app/views/note/new.rhtml
      create  app/views/note/edit.rhtml
      create  app/controllers/note_controller.rb
      create  test/functional/note_controller_test.rb
      create  app/helpers/note_helper.rb
      create  app/views/layouts/note.rhtml
      create  public/stylesheets/scaffold.css

多くのファイルが生成されたけど、いきなり全てを把握するのは無理。 コントローラ (app/controllers/note_controller.rb) と、そこから呼ばれるビュー (app/views/note/*.rhtml) だけ覚えておこう。

足場ができたら、テスト用のサーバ (WEBrick) を起動する。

$ script/server
=> Booting WEBrick...
=> Rails application started on http://0.0.0.0:3000
=> Ctrl-C to shutdown server; call with --help for options
[2006-10-03 23:54:58] INFO  WEBrick 1.3.1
[2006-10-03 23:54:58] INFO  ruby 1.8.2 (2005-04-11) [i386-linux]
[2006-10-03 23:54:58] INFO  WEBrick::HTTPServer#start: pid=2971 port=3000

Web ブラウザでアクセスして、試しにページをいくつか作る。

http://192.168.114.210:3000/note/list   (IPアドレスは VMware で設定した Debian サーバのアドレス)

見た目はともかく、機能としてはページの作成・更新・削除ができるようになってる。

screenshot (Ruby on Rails) - (1)

データがデータベースに格納されていることを、sqlite3 を使って確認する。

sqlite> SELECT * FROM pages;
1|テストです。
2|RandomNoteは、検索を積極活用しているユニークなメモツールです。

* RandomNote - ninjin さんのオリジナル版
* RandomNote/Perl - yakty さんによる Perl への移植版
* RandomNote/PHP - PHPへの移植版

ここまでは簡単。 ここから何をやればいいかで途方にくれるんだけど、まずは見栄えを変えるところからやってみるか。

Tags: Ruby Rails