STEP 11: 確認画面(1)

2010/02/14

今回からしばらく「確認画面」をテーマにして話を続けます。

タスクの新規作成フォームに入力して「次へ」をクリックすると、入力内容をユーザーに確認させる画面が表示されて「保存」ボタンをクリックすると実際にタスクがデータベースに保存され、「戻る」ボタンをクリックすると新規作成フォームに戻る、という流れを実装します。


例によって、ルーティングの変更から。

$ edit config/routes.rb
ActionController::Routing::Routes.draw do |map|
  map.root :controller => 'top', :action => 'index'

  map.resources :tasks,
    :member => { :simple => :get, :finish => :put },
    :collection => { :unfinished => :get, :confirm => :post }
end

この変更により /tasks/confirm という URL にデータを POST できるようになります。


次に、confirm アクションを実装します。

$ edit app/controllers/tasks_controller.rb
class TasksController < ApplicationController
  (省略)

  def confirm
    @task = Task.new(params[:task])
    if @task.valid?
      render :action => 'confirm'
    else
      render :action => 'new'
    end
  end

  def update
  (省略)
end

今回は、とりあえず確認画面を表示させるところまで作ります(「完了」ボタンや「戻る」ボタンの実装は後回し)。

$ edit app/views/tasks/confirm.html.erb
<h1>確認画面</h1>

<%= render :partial => 'record' %>

show.html.erb の一部を部分テンプレート _record.html.erb として抜き出します。

$ edit app/views/tasks/_record.html.erb
<table class="attributes">
  <tr>
    <th>件名</th>
    <td><%= h @task.subject %></td>
  </tr>
  <tr>
    <th>期日</th>
    <td><%= @task.due_date.strftime('%Y/%m/%d') %></td>
  </tr>
  <tr>
    <th>完了</th>
    <td><%= @task.done? ? 'Yes' : '' %></td>
  </tr>
  <tr>
    <th>注記</th>
    <td><%= simple_format @task.note %></td>
  </tr>
</table>
$ edit app/views/tasks/show.html.erb
<h1>タスク詳細</h1>

<%= render :partial => 'record' %>

次にフォームのテンプレートを修正します。

$ edit app/views/tasks/new.html.erb
<h1>新規タスクの追加</h1>

<% form_for [ :confirm, @task ] do |f| %>
<%= render :partial => 'form', :locals => { :f => f } %>
<% end %>

confirm アクションのリンク先を配列で表記すると [ :confirm, @task ] となります。

$ edit app/views/tasks/edit.html.erb
<h1>タスクの編集</h1>

<% form_for @task do |f| %>
<%= render :partial => 'form', :locals => { :f => f } %>
<% end %>
$ edit app/views/tasks/_form.html.erb
<%= f.error_messages %>

<table class="attributes">
  <tr>
    <th>件名</th>
    <td><%= f.text_field :subject %></td>
  </tr>
  <tr>
    <th>期日</th>
    <td><%= f.date_select :due_date %></td>
  </tr>
  <tr>
    <th>完了</th>
    <td>
      <%= f.radio_button :done, true %> Yes
      <%= f.radio_button :done, false %> No
    </td>
  </tr>
  <tr>
    <th>注記</th>
    <td><%= f.text_area :note, :size => '40x5' %></td>
  </tr>
</table>

<div class="submit">
  <%= f.submit f.object.new_record? ? '次へ' : '保存' %>
</div>

ブラウザで動作を確認します。

画面キャプチャ1

画面キャプチャ2

本日はここまで。