« 金曜夜はスヌーカー | メイン | map.resourcesのススメ(「SimplyRestfulプラグインのススメ」改め) »

2006年07月31日 (月)

SimplyRestfulプラグインのススメ [テクニカル]

はじめに

日本Rubyカンファレンスから早2ヶ月弱、DHHのセッションに衝撃を受けた人(僕)もそうでない人もいたと思うが、このセッションで繰り返し語られたCRUDな設計・実装がこれからのRails界の潮流になっていくのは間違いないと思う。

ちなみにまだ見てない人はこちら。

そこで、このDHHのセッションに出てくるCRUDな実装をサポートするプラグインが、SimplyRestfulプラグインだ。

(って書き始めたのはいいのだが、Edge Rails専用だと後で知ってちょっと一般には薦められないかも…と思い始める。まあでも書いちゃったので載せる)

8/2追記:ついにRails本体にSimplyRestfulプラグインがマージされてしまった(Changeset 4637)。やってくれるぜDHH!ということで少し使い方が変更されているので修正。

インストール

ruby script/plugin install http://dev.rubyonrails.org/browser/plugins/simply_restful
インストールは不要。そのかわり最新のEdge Railsを使おう。
rake rails:freeze:edge

基本的な使い方

[Model名の複数形]Controllerがあることを前提とする(名前の変更も可能)。例えばPeopleControllerであれば、routes.rbにこのように書く。

ActionController::Routing::Routes.draw do |map|
  map.resource :person
  map.resources :people # 複数形に変更
end

この1行だけで、以下のルート、名前付きルートが生成される。

Routes
Route Significant Keys Requirements Conditions
/people [:controller, :action] {:controller=>"people", :action=>"create"} {:method=>:post}
/people.:format [:format, :controller, :action] {:controller=>"people", :action=>"create"} {:method=>:post}
/people [:controller, :action] {:controller=>"people", :action=>"index"} {:method=>:get}
/people.:format [:format, :controller, :action] {:controller=>"people", :action=>"index"} {:method=>:get}
/people/new [:controller, :action] {:controller=>"people", :action=>"new"} {:method=>:get}
/people/new.:format [:format, :controller, :action] {:controller=>"people", :action=>"new"} {:method=>:get}
/people/:id;edit [:id, :controller, :action] {:controller=>"people", :action=>"edit"} {:method=>:get}
/people/:id.:format;edit [:id, :format, :controller, :action] {:controller=>"people", :action=>"edit"} {:method=>:get}
/people/:id [:id, :controller, :action] {:controller=>"people", :action=>"destroy"} {:method=>:delete}
/people/:id [:id, :controller, :action] {:controller=>"people", :action=>"update"} {:method=>:put}
/people/:id [:id, :controller, :action] {:controller=>"people", :action=>"show"} {:method=>:get}
/people/:id.:format [:id, :format, :controller, :action] {:controller=>"people", :action=>"show"} {:method=>:get}
Named Routes
Name Route Significant Keys Requirements Conditions
edit_person /people/:id;edit [:id, :controller, :action] {:controller=>"people", :action=>"edit"} {:method=>:get}
formatted_new_person /people/new.:format [:format, :controller, :action] {:controller=>"people", :action=>"new"} {:method=>:get}
new_person /people/new [:controller, :action] {:controller=>"people", :action=>"new"} {:method=>:get}
formatted_people /people.:format [:format, :controller, :action] {:controller=>"people", :action=>"index"} {:method=>:get}
people /people [:controller, :action] {:controller=>"people", :action=>"index"} {:method=>:get}
person /people/:id [:id, :controller, :action] {:controller=>"people", :action=>"show"} {:method=>:get}
formatted_person /people/:id.:format [:id, :format, :controller, :action] {:controller=>"people", :action=>"show"} {:method=>:get}
formatted_edit_person /people/:id.:format;edit [:id, :format, :controller, :action] {:controller=>"people", :action=>"edit"} {:method=>:get}

Scaffoldから使う

PeopleControllerに必要なアクションメソッドは、index, show, new, create, edit, update, destroyの7つ。これはScaffoldで生成されるコントローラとほぼ対応しているのでScaffoldから使ってみるのがお手軽。Scaffoldから使う場合、変更するところは以下の通り。

  • listアクションはindexアクションに変更
    コントローラのlistメソッドの中身は全部indexメソッドに移す。コントローラとビューのaction => 'list'もすべてaction => 'index'もしくはpeople_url(後述の名前付きルートURL)に書き換える。結構いっぱいあるので注意。そしてビューのlist.rhtmlをindex.rhtmlにリネーム。
  • コントローラのverifyを消す
  • edit.rhtmlのstart_form_tagにオプション:method => :putをつける
    <%= start_form_tag :action => 'update', :id => @person %>
    <%= start_form_tag({ :action => 'update', :id => @person }, :method => :put) %>
    <%= start_form_tag person_url(@person), :method => :put %>
    でも可。
  • index.rhtmlのlink_to 'Destroy'にオプション:method => :deleteをつける
    <%= link_to 'Destroy', { :action => 'destroy', :id => person }, :confirm => 'Are you sure?', :post => true %>
    <%= link_to 'Destroy', { :action => 'destroy', :id => person }, :confirm => 'Are you sure?', :post => true, :method => :delete %>
    <%= link_to 'Destroy', person_url(person), :confirm => 'Are you sure?', :post => true, :method => :delete %>
    でも可。

ほかにもあるかもしれません…。

名前付きルートURLを活用する

名前付きルートがたくさん定義されているので、付随してxxx_urlメソッドが使える。例えばperson編集画面へのリンクは、

link_to 'Edit', :action => 'edit', :id => person

の代わりに、

link_to 'Edit', edit_person_url(person)

と書ける。可読性もよくなるのでぜひ使うようにしよう。

ということで

このSimplyRestfulプラグインを使うことで、CRUDな設計・実装をせざるを得なくなるというのが重要なところだ。Constraints are liberating. 制約が自由をもたらす。

(次回、オプションの利用方法に続く)

投稿者 4bit : 2006年07月31日 18:56 このエントリーを含むはてなブックマーク

トラックバック

このエントリーのトラックバックURL:
http://www.4bit.net/x/mt/mt-tb.cgi/133

コメント

コメントしてください




保存しますか?