« 金曜夜はスヌーカー | メイン | map.resourcesのススメ(「SimplyRestfulプラグインのススメ」改め) »
2006年07月31日 (月)
SimplyRestfulプラグインのススメ [テクニカル]
はじめに
日本Rubyカンファレンスから早2ヶ月弱、DHHのセッションに衝撃を受けた人(僕)もそうでない人もいたと思うが、このセッションで繰り返し語られたCRUDな設計・実装がこれからのRails界の潮流になっていくのは間違いないと思う。
ちなみにまだ見てない人はこちら。
- 「Discovering a world of Resources on Rails」スライド (PDF)
- 日本語による解説 by あんどうさん
そこで、このDHHのセッションに出てくるCRUDな実装をサポートするプラグインが、SimplyRestfulプラグインだ。
(って書き始めたのはいいのだが、Edge Rails専用だと後で知ってちょっと一般には薦められないかも…と思い始める。まあでも書いちゃったので載せる)
8/2追記:ついにRails本体にSimplyRestfulプラグインがマージされてしまった(Changeset 4637)。やってくれるぜDHH!ということで少し使い方が変更されているので修正。
インストール
インストールは不要。そのかわり最新のEdge Railsを使おう。ruby script/plugin install http://dev.rubyonrails.org/browser/plugins/simply_restful
rake rails:freeze:edge
基本的な使い方
[Model名の複数形]Controllerがあることを前提とする(名前の変更も可能)。例えばPeopleControllerであれば、routes.rbにこのように書く。
ActionController::Routing::Routes.draw do |map|map.resource :personmap.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. 制約が自由をもたらす。
(次回、オプションの利用方法に続く)
トラックバック
このエントリーのトラックバックURL:
http://www.4bit.net/x/mt/mt-tb.cgi/133