routing nested resources

I've noticed that nested resources are also available via the default route:

In my application I have many gamers and want to give them a singleton profile resource (example.com/gamers/3/profile). So my config.routes includes:   map.resources :gamers, :has_one => [:profile]

Even though it's a singleton, my controller has be pluralized: called ProfilesController and live at app/controllers/profiles_controller.rb with views in app/views/profiles.

The problem I see is that the default route also means that the profiles controller can be accessed at example.com/profiles. Should I write a before_filter to raise 404 if it can't find params[:gamer_id]? It seems the natural place to do this would be config/routes, but the only way to do that would be to remove the default route and explicitly list all of my other controllers. Is there a nicer way to do this that I'm missing?

I'm going to be adding several sub-controllers to my gamers controller; I just gave this as the simplest example. You're right that it makes sense to store profiles on the gamer objects.

Anyone have a solution for the routing, though?

Hm, it doesn't seem to be testable. I wrote:

  def nested     puts request.url     raise ActionController::RoutingError, 'not nested' unless params[:gamer_id]   end

And that works fine. But when I try to test an action:

  def test_edit     alice = gamers(:alice)     # and any of the following:     get :show, :gamer => alice     get :show, :gamer => alice.to_param     get :show, :gamer_id => alice     get :show, :gamer_id => alice.to_param   end

I just get the RoutingError... it says I'm requesting the url http://test.host/profiles/edit/alice instead of the correct url of http://test.host/gamers/alice/profile/edit. How do I tell the functional test to use the more-specific (and earlier in config.routes!) route instead of the default route?

I'd rather serve a 404 than 301 in this case.