今さらRuby on Railsを入門する part2

プロジェクト作成

環境構築出来たので、掲示板アプリを作っていきます。次のコマンドを実行すると、プロジェクトのディレクトリが作成されます。

 # rails bbs -d mysql

オプションで-d mysqlとしないと、デフォルトではsqlite3用として作成されます。
今後Rails用のコマンドを実行する時は、作成されたbbsディレクトリ直下で行います。ディレクトリの中身を確認してみます。

bbsの中身
 README
 Rakefile
 app
 config
 db
 doc
 lib
 log
 public
 script
 test
 tmp
 vendor

scaffoldで自動生成

Railsにはアプリケーションで必要な最低限のファイルを自動生成してくれるscaffoldという機能があるので、最初はこれで作ってみましょう。scaffoldを作るにはscript/generateを使います。generateはRubyスクリプトです。

scaffoldを作成
 # script/generate scaffold entry subject:string name:string content:text
      exists  app/models/
      exists  app/controllers/
      exists  app/helpers/
      create  app/views/entries
      exists  app/views/layouts/
      exists  test/functional/
      exists  test/unit/
      exists  public/stylesheets/
      create  app/views/entries/index.html.erb
      create  app/views/entries/show.html.erb
      create  app/views/entries/new.html.erb
      create  app/views/entries/edit.html.erb
      create  app/views/layouts/entries.html.erb
      create  public/stylesheets/scaffold.css
      create  app/controllers/entries_controller.rb
      create  test/functional/entries_controller_test.rb
      create  app/helpers/entries_helper.rb
       route  map.resources :entries
  dependency  model
      exists    app/models/
      exists    test/unit/
      exists    test/fixtures/
      create    app/models/entry.rb
      create    test/unit/entry_test.rb
      create    test/fixtures/entries.yml
      create    db/migrate
      create    db/migrate/20081220124727_create_entries.rb

scaffoldの引数にmodel構成を指定することで、それに合わせてmodel、view、controllerなどが作成されます。subject、name、contentフィールドを持ったentryテーブルを指定してみました。Railsは名前の付け方が厳密に定められているので注意です。ここで指定するテーブル名は単数形でなければなりません。

データベースの作成

Railsではデータベースの変更はマイグレーションで行います。scaffoldで自動生成されたものを確認してみます。

db/migrate/20081220124727_create_entries.rbファイル

class CreateEntries < ActiveRecord::Migration
  def self.up
    create_table :entries do |t|
      t.string :subject
      t.string :name
      t.text :content

      t.timestamps
    end
  end

  def self.down
    drop_table :entries
  end
end

ActiveRecordを継承したCreateEntriesクラスで、self.upとself.downが定義されています。self.upにデータベースを変更するコードを書き、self.downに元に戻すコードを書きます。この例では、self.upでcreate tableを行うコード、self.downでdrop tableするコードが書かれています。テーブル名がscaffoldで指定したentryの複数形になっています。Railsのルールで、テーブル名は複数形と定められているからで、辞書によって自動変換してくれます。
ファイル名に日付がついていましたが、バージョン管理のためです。つまり、好きな時点へスキームを進めたり戻したり出来るわけです。subversionソースコードのバージョン管理は上手く出来ますが、データベースも同じレベルで実現出来ます。
scaffoldではマイグレーションのファイルが作られるだけなので、実際にデータベースに反映していきます。一般的にはデータベースに繋いでcreate database、となるわけですが、ここでもRailsの便利さを味わう事が出来ます。
まずはデータベース設定ファイルであるconfig/database.ymlを環境に合わせて編集しておきます。development用とtest用とproduction用の3種類が設定出来ますが、とりあえずdevelopment用だけで良いです。アプリケーションで使用するデータベース名と、権限のあるユーザとパスワードを指定しておきます。
で、

rake db:create

以上でdatabase.ymlのdevelopmentに指定したデータベースが作成されます。rakeはRubyのビルドツールで、javaで言うAntみたいなものです。rake -Tを実行することで、Railsで使える各種のタスク一覧が見られます。また、タスクを自分で作成することも出来ます。
データベースが作成されたので、テーブルを作成します。

rake db:migrate

以上でマイグレーションが実行されデータベースが最新の状態になります。ちなみにrakeタスクにはdb:migrate:downやdb:migrate:upというものもあり、マイグレーションによるバージョン管理が可能なことをうかがわせてます。

アプリケーションの確認

scaffoldでcontrollerやviewも作成されていたので、テーブルさえ作成出来ればアプリケーションを実行出来る環境は整っています。Rails内蔵のサーバーを起動してみましょう。

script/server

サーバーが起動して、http://localhost:3000にアクセスすることで確認出来ます。RailsはURLからcontrollerを判断してmodelからデータを加工してviewを表示する流れになっています。通常はmodel名でindexを表示するcontrollerが作成されているはずなので、http://localhost:3000/entriesにアクセスしてみます。

一覧画面ですが、作成したばかりなので何もデータはありません。New entryをクリックして登録画面に移動します。

これが登録画面です。2件ほどデータを追加してみます。

一覧画面にデータが追加されています。

完成

データの編集や削除も可能で、とりあえず使用出来るレベルの物が出来上がりました。慣れれば5分で実践出来ると思います。
viewやcontrollerはappディレクトリの中に作成されていて、編集するとサーバーの再起動無しに確認出来るので色々触ってみると良いでしょう。次回はこのbbsを元に色々と機能強化していきたいと思います。
つづく