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?

A question I’m tempted to ask is: why do you need to separate a gamer
and
their profile? Why not just store the profile information on a gamer?


Ryan B.
http://www.frozenplague.net

On Dec 20, 9:20 pm, “Ryan B.” [email protected] wrote:

A question I’m tempted to ask is: why do you need to separate a gamer and
their profile? Why not just store the profile information on a gamer?

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?

On Dec 20, 9:40 pm, “Ryan B.” [email protected] wrote:

Defining a before_filter seems like the least painful way to go about it.

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?

Defining a before_filter seems like the least painful way to go about
it.

On Dec 21, 2007 12:58 PM, Peter H. [email protected] wrote:

Anyone have a solution for the routing, though?


Ryan B.
http://www.frozenplague.net

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

raise the RoutingError and then say in your tests that the show page
should
raise error. I’ve only ever done RSpec testing so I’m not much help on
the
baked-in Rails testing front.

On Dec 21, 2007 2:37 PM, Peter H. [email protected] wrote:

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


Ryan B.
http://www.frozenplague.net

What’s wrong with doing it a little simpler?
private
def check_for_gamer_id
redirect_back_or_default(default_controllers_path) if
params[:gamer_id].nil?
end


Ryan B.
http://www.frozenplague.net

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs