Ruby on Rails 3.0 日記
第8回: タスクの新規追加
前回は、タスクの登録フォームを追加しました。
今回は、タスクを追加する 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 ですね。
(2010/05/09)
記事に関するご質問は、 hermes@oiax.jp までメールでお送りください。
ウェブサイト構築の発注先を検討されているお客様は、ご相談フォームをご利用ください。
- はじめに
- 第1回: インストール (2010/04/24)
- 第2回: 新規アプリケーションの作成 (2010/04/25)
- 第3回: コントローラとビューの生成(1) (2010/04/28)
- 第4回: コントローラとビューの生成(2) (2010/04/29)
- 第5回: データベーステーブルとモデル (2010/05/01)
- 第6回: タスクの一覧 (2010/05/02)
- 第7回: タスクの新規追加フォーム (2010/05/09)
- 第8回: タスクの新規追加 (2010/05/09)
- 第9回: タスクの完了 (2010/05/15)
- 第10回: 完了したタスクの一覧 (2010/05/16)
- 第11回: Bundler (2010/05/17)
- 第12回: ユーザー認証(1) (2010/05/18)
- 第13回: ユーザー認証(2) (2010/05/19)
- 第14回: ユーザーとタスクの関連づけ (2010/05/29)
- 第15回: Devise によるユーザー認証機能の日本語化(1) (2010/10/09)
- 第16回: Devise によるユーザー認証機能の日本語化(2) (2010/10/15)
- 第17回: Devise によるユーザー認証機能の日本語化(3) (2010/10/16)

