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.