« Nested Resources (map.resourcesのススメ その3) | メイン | Rails勉強会@東京 第11回 »

2006年10月05日 (木)

map_singular_resourceプラグイン [テクニカル]

きのうのエントリに書いたが、Railsのmap.resourcesに対応するリソースは複数形で、複数あることが前提とされていた。それじゃ単数(1つしかない)リソースの場合どうするんだよ、ってことで、単数リソースに対応するmap_singular_resourceプラグインを作ってみた。

使い方

routes.rbに、map.resourcesと違って単数形で書く。

map.resource :person
# 紛らわしいので map.singular_resource :person も可

すると、だいたいこんな感じのルーティングが生成される。

HTTPメソッドとURLPersonControllerのアクションRoute Name
GET /person show person
POST /person create person
GET /person;edit edit edit_person
PUT /person update person
DELETE /person destroy person

map.resourcesからnewとindexを除いたような感じ。省略したけど、拡張子の:formatにももちろん対応している。:controller指定やアクション追加などのオプションももちろん使える。

has_one関係に使う

実はあんまり単体で使うことは少ないかもしれない。使われるとすればNested Resourcesで、モデル間の関係がhas_oneになっているときだ。

例えばUser has_one :profileというモデルの関係があったとすると、routes.rbにこのように書く。

map.resources :users do |user|
  user.resource :profile
end

すると、こんな感じのルーティングになる。

HTTPメソッドとURLProfileControllerのアクションRoute Name
GET /users/:user_id/profile show profile
POST /users/:user_id/profile create profile
GET /users/:user_id/profile;edit edit edit_profile
PUT /users/:user_id/profile update profile
DELETE /users/:user_id/profile destroy profile

きれいなURLでhas_oneの関係に対応しているのがわかる。

ソースは思いっきり手を抜いてactionpack/lib/action_controller/resources.rbからコピー&ペーストで作ったのでDRYじゃないし、相変わらずテストもないので不具合あるかも。でも使う機会はきっとあるような気がするなー。

投稿者 4bit : 2006年10月05日 17:43 このエントリーを含むはてなブックマーク

トラックバック

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

コメント

コメントしてください




保存しますか?