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?
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.
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
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.
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.
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.