第7回: タスクの新規追加フォーム

2010/05/09

前回 は、タスクの一覧を表形式で表示するところまで作りました。

今回は、タスクの登録フォームを追加しましょう

コントローラの修正

まず、コントローラを修正します。エディタで app/controllers/tasks_controller.rb を開いて、次のように修正します。

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

登録フォームの追加

続いて、app/views/tasks/index.html.erb を次のように修正します。

<%= form_for @task do |form| %>
<ul>
  <li><%= form.label :name %><%= form.text_field :name %></li>
  <li><%= form.label :due_date %><%= form.date_select :due_date %></li>
  <li><%= form.submit %></li>
</ul>
<% end %>

<table class="tasks">
  <col class="name" />
  <col class="due_date" />
  <%= render @tasks %>
</table>

form_for の前に等号(=)が付いている点に注意してください。Rails 2.3 まではここに等号を書くとエラーになりましたが、Rails 3.0 ではここに等号を書かないとログに警告が出力されます。

form_for の前に = 記号を書くということは、form_for が文字列を返すことを意味します。実は Rails 2.3 までの form_for は ERb に直接出力していたため、form_for を含む自前のヘルパーメソッドが書きにくいという問題がありました。歓迎すべき仕様変更です。

また、Rails 2.3 までは

form_for :name, @resource do |form|

のように書くことができましたが、Rails 3.0 では次のように書かないとログに警告が出力されます。

form_for @resource, :as => :name do |form|

スタイルシートの追加

新規ファイル public/stylesheets/form.css を次のように作成します。

form {
  width: 540px;
  margin: 5px auto;
  background-color: #cff;
  padding: 9px;
  border: solid 1px #ccc;
}

form ul {
  list-style:none;
  margin:0;
  padding:0;
}

form li {
  margin:0;
  padding:0;
}

form label {
  display:block;
  width:100px;
  float:left;
  padding-top:.2em;
}

form input[type=submit] {
  display: block;
  margin: 5px 5px 5px auto;
}

ブラウザで表示確認

ブラウザで http://localhost:3000/tasks を開くと、次のような画面が現れます。

画面キャプチャ1

細かいことですが、送信ボタン上のラベルが「Create Task」となっているのは、Rails 3.0 での改善点です。Rails 2.3 までは、新規作成フォームでも編集フォームでも同じように「Save changes」というラベルがデフォルトで表示されていました。Rails 3.0 では、変数 @task の状態に合わせて「Create Task」か「Update Task」とラベルを切り替えてくれます。