第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 フィールドに適当な日付をセットして…
「Create Task」をクリックします。
あれれ。エラーは起きませんでしたが、何の変化もありません。何が起こっているのでしょうか。
ログを読む
ターミナルにログが表示されていますので状況を探ってみましょう。
ログの下から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
そして、ブラウザでタスクの登録をやり直すと…
OK ですね。