« 2006年06月 | メイン | 2006年08月 »
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. 制約が自由をもたらす。
(次回、オプションの利用方法に続く)
投稿者 4bit : 18:56 | コメント (0) | トラックバック (0)
2006年07月28日 (金)
金曜夜はスヌーカー [ビリヤード・スヌーカー]
会社の同期の友人に車を出してもらい、ドリームショット武蔵村山本店にスヌーカーを撞きに行った。前回に続いて2回目。
第1フレーム、第2フレームは友人がファールしまくりで98-31、91-20。僕もかなりイージーなボールが入らなかったり、ミスが多かった。ハイエストはレッド-ブラックの8点。ここまでけっこう時間がかかって、次のフレーム最後までできるか微妙だったのだが、第3フレームはファールも少なくけっこうボールが入って、無事最後までできた。63-13。
どうも感覚的に、スヌーカークラブやサムタイムよりここドリームショットのテーブルのほうがよく入るような気がする。前サムタイムで全然入らずにグダグダだったので今日はちょっと心配していたのだが、ブレイクこそ出ないもののそこそこレッドは入った。ドリームショットのテーブルのポケットは少し甘めなのか、それとも明るいところでやったほうが入るのかもしれない。
投稿者 4bit : 23:59 | コメント (0) | トラックバック (0)
2006年07月24日 (月)
Rails勉強会@東京 第8回 [テクニカル]
昨日行われたRails勉強会に参加。
ポジションペーパーは、「ABDはやり過ぎてもいいのか否か」。結論から言うと「やり過ぎてもよい」なのだが、詳細は調べてあとで書く(つもり)。
今回ちょっとセッション選びを間違えちゃったかな…。「RailsでABD実践」のセッションが後半にも行われると聞いて前半選ばなかったのが失敗だった。結局前半は「Rails Chatのソースを読む」を選択。のりおさん作のRails Chatのソースを読んだ。Flashのxmlsocketを使って、サーバとブラウザ間にコネクションを張ってリアルタイムにページの更新を行ったりできる「Juggernaut」(の古いバージョン)を使っているのが特徴。詳細な情報はこのへんに。
後半は「BackgrounDRbを触ってみる」。よしみかんさんのまとめ「I sort my thought... - BackgrounDRbについて調べてみた」を見ながらみんなで動かしてみた。僕はノートPCを持っていなかったこともあり少しうとうとしてしまった。心より恥じる。
相変わらずREST好きな僕としては、もろはしさんの「ABDとCRUD/Railsは相性がいい」やYuguiさんの「ABDはアジャイルで変更に強いDB設計だ」あたりの意見にかなり強い興味があるので、次回もセッション希望というか、次回までに自分でもそのへん(とくにRailsやRESTにどう生かせるのか)を予習して臨みたい。というか予習したらblogに書く。あと個人的におすすめのSimplyRestfulプラグインの(ある程度詳細な)紹介をURLのaction撲滅運動(?)と絡めて書く。
追記:デブサミでのはぶさんのセッション資料にABDの記述を発見。デブサミのときからあったのか…。Seasar Conferenceの資料はあるみたいだけどサーバが死んでるのか見れません。見れました。
- Developer Summit 2006 - 楽々ERDレッスンLive (PDF)
- Seasar Conference 2006 Spring - EJB3時代のERDレッスン~Activity Based Datamodel (PowerPoint)
投稿者 4bit : 14:00 | コメント (0) | トラックバック (0)
2006年07月20日 (木)
ドラゴンのスヌーカーレッスン Part6 [ビリヤード・スヌーカー]
おなじみドラゴン福田豊氏のレッスン会@スヌーカークラブに参加。
今日は調子自体は悪くはなかった(と思う)んだけど、結果はカラーボール入らず…。福田さんの調子がよくて、チャンスで回ってこなかった(という言い訳)。新たな課題は、フォロースルーが短いということ。きっちりキューボールの走る方向をイメージして、手が胸に当たるぐらいまでフォロースルーをバシッととろう。それができたらテイクバックも大きめに、根元まで引こう。というのが指摘ポイントだった。
あと、1人で練習していて、ブルーのロングコーナー(いわゆるセンターショット。スポットのブルーをボークラインからまっすぐにコーナーへ狙う。距離があるので激ムズ)をやってみたら一発で入っちゃってびっくりした。たぶんこの距離で入ったの初めて。ちなみに福田さんはこれを7割ぐらい入れる(スヌーカー×スヌーカー:ロング・コーナー 120球 その5 より)。UKのトッププロは9割ぐらい? 僕は絶対1割も入らない。あまりのレベルの違いというのがよくわかる例でした。
投稿者 4bit : 23:59 | コメント (0) | トラックバック (0)
2006年07月09日 (日)
ひどい… [ビリヤード・スヌーカー]
先輩のS氏と新宿へゴハンを食べに行ったついでにサムタイムへスヌーカーを撞きに行ったのだが、2人とも全然入らず。1フレーム終わるのに1時間45分もかかってしまった…。ひどい。
それでも途中チャンスがなかったわけではなく、レッドを入れてブラックへポジション、これを入れればレッド-ピンクへつながる…というときにブラックを外してしまったり。結果的に良かったのは最後のミドルレンジのブルーを入れてピンクも入れたぐらい。
うーむもっと修業が必要ですねぇ…。
投稿者 4bit : 23:59 | コメント (3) | トラックバック (0)