db2 on Rails
DB2でさくさく実現するRESTfulなDBアプリ(3)

FirebugでRESTfulなDBアプリに挑戦!!

日本アイ・ビー・エム株式会社
Team Ruby
野間 愛一郎
2009/1/5

URIでCRUDを実現する

 RESTにおけるURIはこれまでの 「controller/action/id」 の形式ではなく、controllerの後にIDを記述します(「controller/id」)。actionに相当する内容は、HTTP Methodで表現されます。

 Railsではroutes.rb(C:\demo\config\ routes.rb)でルーティングの設定を行うと、すぐにRESTfulなURLを使用することができます。

 コントローラに対して、RESTfulなルーティングを設定するには、routes.rbに「map.resources :コントローラ名」を追加するだけです(サンプル1)。

サンプル1 routes.rb
ActionController::Routing::Routes.draw do |map|

  map.resources :movies

  map.connect ':controller/:action/:id'
  map.connect ':controller/:action/:id.:format'
end

 コントローラには、基本的な7つのアクションが実装されており、RESTfulなURLで使用することができます(表1)。C:\demo\app\controllers\movies_controller.rb ファイルをエディタで開いて確認すると、7つのアクションが定義されていることが分かります)。

表1 Ruby on Railsで実装されているアクションの定義とURI
アクション HTTP Method URI 説明
index GET /movies 一覧を表示
show GET /movies/123 1件を表示
new GET /movies/new 新規作成するためのフォームを表示する
edit GET /movies/123/edit 更新するためのフォームを表示する
create POST /movies 新規作成
update PUT /movies/123 更新
destroy DELETE /movies/123 削除

 現在のWebブラウザでは、PUTとDELETEメソッドに対応していません。そこで、実際にはPOSTメソッドが使われています。

 実際にURIを入力して、動作を確認してみましょう。表1に記載したとおり、1件表示、更新、削除はすべて同じURIです。「http://localhost:3000/movies/ID番号」にアクセスすると、ID番号のデータの詳細が表示されます(図3)

注:ID番号は自動採番されるユニーク値です。ID番号の確認は 「http://localhost:3000/movies」へアクセスした際に一覧表示されるDesc項目の横にある、Show、Edit、Destroyのリンクを見れば確認できます。
図3 http://localhost:3000/movies/126を表示する

 ここで、Webサーバ起動時に使ったコマンド画面を見てみましょう(リスト4)。

リスト4 図3のURIにアクセスした際のWebサーバ側コンソールの状態
127.0.0.1 - - [20/Nov/2008:10:00:00 東京 (標準時)] "GET /movies/126 HTTP/1.1" 200 1013
http://localhost:3000/movies -> /movies/126

 図3で表示されている内容は確かにHTTPのGETメソッドを使用してアクセスされたことが確認できます。

 では、同じURIを使用している更新や削除の場合はどうでしょうか。

 削除の場合を例に見てみましょう。前述のようにブラウザはDELETEメソッドを送信できません。では、どのようにして1件表示、更新、削除を区別してアクセスしているのでしょうか。

 Firebugを使用して、動きを見てみましょう。

 Firebugの「調査」ボタンをクリックし、任意のデータの「Destroy」を選択すると、左下のウィンドウに「Destroy」でPOSTされる内容が確認できます(図4、リスト5)。

図4 Firebugによる調査の開始


リスト5 Firebug上の表示
m = document.createElement('input'); m.setAttribute('type', 'hidden');
m.setAttribute('name', '_method'); m.setAttribute('value', 'delete');

 POSTされる内容を見ると、リスト5のとおり、隠し入力でDELETEメソッドを送っていることが分かります。

 また、削除を実行すると隠し項目を含んだリクエストがPOSTメソッドで送られたことが確認できます(リスト6)。

リスト6 Webサーバ側コンソールの状態
127.0.0.1 - - [21/Nov/2008:10:01:00 東京 (標準時)] "POST /movies/126 HTTP/1.1" 302 94
http://localhost:3000/movies -> /movies/126

 このようにRailsは隠し入力を使用して、PUTメソッドやDELETEメソッドを判断しているのです。

アプリケーションからの接続が簡単に

  すべてのリソースに対し、URIでアクセス可能になると、アプリケーションからの接続が非常に簡単になります。場合によっては、データベースにアクセスするよりも、URIにアクセスした方が簡単にデータが取得できる、というケースも出てくるかもしれません。

 コラムでは、Webクエリを使用して、Microsoft Excelから、リソースのデータを取得する方法を簡単に紹介します。

前のページへ 2/5 次のページへ

Index
DB2でさくさく実現するRESTfulなDBアプリ(3)
FirebugでRESTfulなDBアプリに挑戦!!
  Page 1
・Firebugを利用したデバッグ
・RESTの話をあらためて
 コラム1:Firebugの導入手順
・Rails環境の準備
  モデルの作成とデータベースへの反映|Webサーバの起動
→ Page 2
・URIでCRUDを実現する
 コラム2:Webクエリを使用して、Excelからリソースへアクセスする
  Page 3
JavaScript(Jester)でリソースに直接アクセスする
・Jesterの準備
  レイアウトファイルの編集|Webサーバの再起動|modelクラスの宣言
 コラム3:JesterのJSONサポート
  Page 4
 CRUDの実行1(Create)
 CRUDの実行2(Read)
  Page 5
  CRUDの実行3(Update)
   CRUDの実行4(Delete)

バックナンバー DB2でさくさく実現するRESTfulなDBアプリ



Database Expert フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Database Expert 記事ランキング

本日月間