おこづかい帳アプリを作る(1)
Railsとgitの勉強用にでおこづかい帳アプリを作ってみます。徐々に機能追加したりプラグインを利用したりしたいです。
開発環境はMacBookで以下のとおり。
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の間に一対多の関連を設定します。
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の金額は数字のみ
うわ、いきなりテスト書いてない...