おこづかい帳アプリを作る(1)

Railsとgitの勉強用にでおこづかい帳アプリを作ってみます。徐々に機能追加したりプラグインを利用したりしたいです。
開発環境はMacBookで以下のとおり。

プロジェクトの作成

まずは、プロジェクトを作成します。新規Railsプロジェクトの作成か、以下のコマンドを実行します。

rails moneytrack -d sqlite3

scaffoldの作成

出費を管理するためのモデルEntryのscaffoldを作成します。

ruby script/generate scaffold Entry occur_at:date amount:decimal note:string

db/migrate/20080728******_create_entries.rb ファイルを開き、occur_atとamountはnull不可に変更してマイグレーションを実行します。。

class CreateEntries < ActiveRecord::Migration
  def self.up
    create_table :entries do |t|
      t.date :occur_at, :null=>false
      t.decimal :amount, :null=>false
      t.string :note

      t.timestamps
    end
  end

  def self.down
    drop_table :entries
  end
end

分類を管理するためのモデルCategoryのscaffoldを作成してマイグレーションを実行します。

ruby script/generate scaffold Category name:string note:string
rake db:migrate

ひとまずサーバを起動してEntryとCategoryのscaffoldを確認

一対多の関連の設定

EntryとCategoryの間に一対多の関連を設定します。
entriesテーブルにcategory_idを追加するために、マイグレーションファイルを作成します。

script/generate migration add_category_id_to_entries

db/migrate/20080728******_add_category_id_to_entries.rb ファイルを開き以下の様に変更します。

class AddCategoryIdToEntries < ActiveRecord::Migration
  def self.up
    add_column :entries, :category_id, :integer, :null=>false, :default=>0
  end

  def self.down
    remove_column
  end
end

マイグレーションを実行します。
モデルに一対多の関連を追加します。

class Category < ActiveRecord::Base
  has_many :entries # 追加
end

class Entry < ActiveRecord::Base
  belongs_to category # 追加
end

Entryの入力時に一覧から分類を選択できるようにビュー(app/view/entries/new.html.erb)を変更します。form_forの中にcollection_selectを追加します。

  ...(省略)...
<% form_for(@entry) do |f| %>
  <%= f.error_messages %>
  <p>
    <%= f.label :category_id %><br />
    <%= f.collection_select("category_id", Category.find(:all), :id, :name, :include_blank => '選択してください') %>
  </p>
  ...(省略)...

:include_blank => '選択してください'で初期状態の選択肢を追加しています。
これで、分類を選択できるようになりました。

バリデーション

モデルに登録時のバリデーションのための記述を追加します。

class Category < ActiveRecord::Base
  validates_presence_of :name

  has_many :entries
end

class Entry < ActiveRecord::Base
  validates_presence_of :amount, :category_id
  validates_numericality_of :amount

  belongs_to :category
end

これで以下のようなバリデーション行われます(テーブルで、"null => false"としただけでは空文字列の場合に必須チェックにかかりません)。

  • Categoryの名前(name)は必須
  • Entryの金額(amount)と分類(category_id)
  • Entryの金額は数字のみ

うわ、いきなりテスト書いてない...