RESTful なインターフェースを備えた Web アプリケーション(その 6)

いよいよ edit, update, destroy を作ります。データの編集と削除は詳細画面からできるようにしたいので、show の View をまず修正します。

sample/app/views/customers/show.html.erb

<h1>顧客詳細</h1>
<table border>
  <tr><th>顧客 ID</th><td><%= @customer.id %></td></tr>
  <%= render @customer %>
</table>
<table>
  <tr>
    <td><%= button_to '編集', edit_customer_path(@customer.id), :method => :get %></td>
    <td><%= button_to '削除', customer_path(@customer.id), { :method => :delete, :confirm => '本当に削除しますか ?' } %></td>
  </tr>
</table>
<%= render 'back' %>

View の作成

sample/app/views/customers/edit.html.erb

<h1>編集</h1>
<%= form_for @customer, :html => { :method => :put } do |f| %>
<%= render 'form', :form => f, :button_name => '修正' %>
<% end %>
<%= render 'back' %>

sample/app/views/customers/update.html.erb

<%= render 'msg' %>
<table border>
  <%= render @customer %>
</table>
<%= render 'back' %>

sample/app/views/customers/destroy.html.erb

<%= render 'msg' %>
<table border>
  <%= render @customer %>
</table>
<%= render 'back' %>

あらかじめ部分テンプレートを用意したので update と destroy はかなりシンプルになっています。

Controller の修正

sample/app/controllers/customers_controller.rb

# coding: utf-8

class CustomersController < ApplicationController

  def index
    @customers = Customer.all
  end

  def show
    @customer = Customer.find(params[:id])
  end

  def new
    @customer = Customer.new
  end

  def create
    @customer = Customer.create(params[:customer])

    if !@customer.new_record?
      @msg = '登録されました'
    else
      @msg = '登録に失敗しました'
    end
  end

  def edit
    @customer = Customer.find(params[:id])
  end

  def update
    @customer = Customer.find(params[:id])

    if @customer.update_attributes(params[:customer])
      @msg = '編集されました'
    else
      @msg = '編集に失敗しました'
    end
  end

  def destroy
    @customer = Customer.find(params[:id])

    if @customer.destroy
      @msg = '削除されました'
    else
      @msg = '削除に失敗しました'
    end
  end

end

次回は実際に動作するところをサンプルでお見せします。