nested routes with a 2-way has_many using join table?

I have two classes, InstructionalObject and Assets. They both have_many of the other, implemented through a join table (so it's like a habtm without the habtm).

For the next version of our app, we're refactoring to RESTful, and i'm having trouble with my nested resources/routes. I tried this, in routes.rb:

  map.resources :assets do |assets|     assets.resources :instructional_objects   end

  map.resources :instructional_objects do |instructional_objects|     instructional_objects.resources :assets   end

thinking that would let me do

  instructional_objects/:id/assets

to get all the assets belonging to that instructional_object

and

  assets/:id/instructional_objects

for vice-versa.

However, when i go to these urls i get all assets, and all instructional objects respectively: in other words, these two routes seem to be equivalent

  "instructional_objects/:id/assets" and "assets"

and these two are equivalent:

  "assets/:id/instructional_objects" and "instructional_objects".

To make life more confusing for myself (initially at least) i'm also using resource_this in my controllers. Looking in the log, it looks like the right request (i think) is going through:

Processing AssetsController#index (for 127.0.0.1 at 2008-03-12 13:45:56) [GET]   Session ID: 4ca8db0cc675a9dd71fc0ee96031f6ea   Parameters: {"instructional_object_id"=>"0", "action"=>"index", "controller"=>"assets"}

Can anyone help, please? max

I understand the need to use has_many :through in both directions, but does your _site_ actually need to present the data to users in both directions? Sometimes this can be more of a theoretical need than a practical one.

At any rate, if you're "going RESTful" with brand new controllers, the controllers themselves need some help. They don't know anything about the routing that directed the request to them so you've got to add some code.

The main question that you need to answer is whether you ever need to render an index that's not scoped. That is, will you ever need to render a list of assets (all) rather than assets that are associated to a particular instructional_object? If not then you can simply modify your index method along these lines:

def index   @instructional_object = InstructionalObject.find(param[:instructional_object_id])   @assets = @instructional_object.assets end