連結テーブルに対する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 は考えたら負けか。