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 という考え方をぜひ身に付けてもらいたいと思います。