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

ルーティングの確認

sample ディレクトリで

> rake routes

を実行してみてください。

    customers GET    /customers(.:format)          customers#index
              POST   /customers(.:format)          customers#create
 new_customer GET    /customers/new(.:format)      customers#new
edit_customer GET    /customers/:id/edit(.:format) customers#edit
     customer GET    /customers/:id(.:format)      customers#show
              PUT    /customers/:id(.:format)      customers#update
              DELETE /customers/:id(.:format)      customers#destroy

RESTful とはまさにこういうことです。同じ /customers にアクセスするにしても GET メソッドでアクセスしたら index アクションが呼ばれますし、POST メソッドでアクセスしたら create アクションが呼ばれます。

View の再構築

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

<h1>顧客一覧</h1>
<table border>
  <thead>
    <tr>
      <th>顧客 ID</th>
      <th>顧客名</th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <% @customers.each { |c| %>
    <tr>
      <td><%= c.id %></td>
      <td><%= c.customer_name %></td>
      <td><%= button_to '詳細', customer_path(c.id), :method => :get %></td>
    </tr>
    <% } %>
  </tbody>
</table>

button_to はボタンを作成する Form Helper です(ソース上は form 要素内の input type="submit" で実現されます)。customer_path はルーティングによって自動生成された Url Helper です。ルーティングの設定があることによって適切な URL が生成されます。show アクションを呼び出したいので GET メソッドでアクセスするように指定しています(デフォルトは POST)。

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

<h1>顧客詳細</h1>
<table border>
  <tr><th>顧客 ID</th><td><%= @customer.id %></td></tr>
  <tr><th>顧客名</th><td><%= @customer.name %></td></tr>
  <tr><th>連絡先</th><td><%= @customer.phone %></td></tr>
</table>
<p><%= link_to '一覧に戻る', customers_path %></p>

link_to はハイパーリンクを生成する Link Helper です。customers_path もルーティングによって自動生成された Url Helper です。

sample/app/views/layouts/customers.html.erb は削除します。

sample/app/assets/stylesheets/customers.css.scss

h1 {
  text-align : center;
  font-size : x-large
}

table { margin : auto }

p { text-align : center }

Controller の修正

sample/app/controllers/customer_controller.rb

class CustomersController < ApplicationController
  def index
    @customers = Customer.all
  end

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

params で id を取得する方法が簡略化されました。レイアウトはデフォルトのものを使う設定に戻します。

実行してみる

> rails server

を実行して localhost:3000/customers にアクセスしてみましょう。

どれでもいいのでボタンをクリックしてみましょう(サンプルは 1 番の「詳細」ボタンをクリックした場合)。

このときアドレスバーに注目してほしいのですが、URL は

localhost:3000/customers/1

となっているはずです。これはルーティングの設定で

/customers/:id

となっていた部分(:id の部分は取得したデータの id によって変化する)です。この URL に対して GET メソッドでアクセスしたので正しく show アクションが呼ばれました。

RESTful という考え方は、最初のうちはやや混乱するかもしれません(というか、Java から入った私はちょっと混乱しました)が、慣れてくるとアプリケーションの設計としてはすっきりするので非常に有効な考え方になります。これから Rails をバリバリ使いたい人は、この RESTful という考え方をぜひ身に付けてもらいたいと思います。