第8回: タスクの新規追加

2010/05/09

前回は、タスクの登録フォームを追加しました。

今回は、タスクを追加する create アクションを追加します。

ルーティングの修正

エディタで config/routes.rb を開いて、次のように修正してください。

Nchak::Application.routes.draw do
  resources :tasks, :only => [ :index, :create ]
end

create アクションの追加

次に app/controllers/tasks_controller.rb を次のように修正します。

class TasksController < ApplicationController
  def index
    @task = Task.new
    @tasks = Task.all(:conditions => { :done => false }, :order => "due_date")
  end

  def create
    @task = Task.new(params[:task])
    @task.save
    redirect_to :tasks
  end
end

params[:task] は、フォームへの入力データを Hash オブジェクトとして返します。これを Task モデルの new メソッドに渡すと Task オブジェクト @task が生成されますが、この時点ではまだデータベースに保存されていません。@task.save はこのオブジェクトをデータベースにレコードとして保存します。

次に、redirect_to :tasks が実行されます。これは :tasks という名前の付けられたリソースにリダイレクションするという意味です。redirect_to :action => 'index' と同じであり、要するに「タスク一覧ページに戻れ」ということです。

タスクの追加をブラウザで動作確認

では、ブラウザで動作確認をしましょう。

Name フィールドに「切手を買う」、Due Date フィールドに適当な日付をセットして…

画面キャプチャ1

「Create Task」をクリックします。

画面キャプチャ2

あれれ。エラーは起きませんでしたが、何の変化もありません。何が起こっているのでしょうか。

ログを読む

ターミナルにログが表示されていますので状況を探ってみましょう。

画面キャプチャ3

ログの下から5行から3行目にかけて、発行された SQL 文が記録されています。黄色の下線を引いた部分がポイントです。done カラムに false ではなく NULL を持つレコードが挿入されたため、index アクションで検索に引っかからなかったのです。

done カラムに NULL がセットされても意味がないので、デフォルト値を設定して NOT NULL 制約を課しましょう。

マイグレーションスクリプトの修正

db/migrate/YYYYMMDDHHMMSS_create_tasks.rb ('YYYYMMDDHHMMSS' は任意のタイムスタンプ)を開いて次のように修正します。

class CreateTasks < ActiveRecord::Migration
  def self.up
    create_table :tasks do |t|
      t.string :name
      t.date :due_date
      t.boolean :done, :null => false, :default => false

      t.timestamps
    end
  end

  def self.down
    drop_table :tasks
  end
end

もう一つターミナルを開いて、マイグレーションをやり直し、シードデータを再度投入します。

rake db:migrate:reset
rake db:seed

そして、ブラウザでタスクの登録をやり直すと…

画面キャプチャ4

OK ですね。