連結テーブルに対するURIの定義
http://d.hatena.ne.jp/yssk22/20080403#1207235731 で書いた話の続き。belongs_to をみながらURIを定義するのは辞めよう、という結論です。
map.resources :feeds map.resources :subscriptions, :path_prefix => "/:user_id",
とやることで、
/feeds/ /feeds/new /feeds/:id /feeds/:id/edit /:user_id/subscriptions/ /:user_id/subscriptions/new /:user_id/subscriptions/:feed_id /:user_id/subscriptions/:feed_id/edit
は実現できる。が、ここで、Subscription (1) => (N) Tags という関係があるとさらにややこしくなる。購読に対してタグがつくので、厳密には、すべてのタグ、を表すリソースのURIは、
/subscriptions/tags
としたいわけだ。当然、ユーザーが使用したタグは、
/:user_id/subscriptions/tags
でもいいんだけれど。裏技としてはこれか?
//subscriptions/tags
要するに :user_id を省略するという表記方法。
たぶん根本の問題は、連結テーブルに含まれるような、親を指定することで一意に特定できるようなリソースに対して、「親を指定しない」という特定方法をURIで記述するのが不可能っぽい、ということだろうと思うが。
結局、URIとして多少重複のある以下を定義するとすっきりすることになる。
/user/:user_id/subscriptions/ /user/:user_id/subscriptions/new /user/:user_id/subscriptions/tags /user/:user_id/subscriptions/:feed_id /user/:user_id/subscriptions/:feed_id/edit /feed/:feed_id/subscribers/ /feed/:feed_id/subscribers/new /feed/:feed_id/subscribers/:user_id /feed/:feed_id/subscribers/:user_id/edit /subscriptions/tags
ここまでくると、belongs_to は考えたら負けか。