I would like to trim down the routes on my application so that:
http://myapplication.com/users/peter/questions/how-do-i-create-urls
becomes...
http://myapplication.com/peter/how-do-i-create-urls
I have a users controller and would like it to be resourceful. Users also have a nested resource called questions.
Basic routes file
Without any URL trimming, the routes file looks like this:
... resources :users do resources :questions end
However the URLs from this take the form of
http://myapplication.com/users/peter/questions/how-do-i-create-urls
rather than
http://myapplication.com/peter/how-do-i-create-urls
Partial success I have tried doing the following:
... resources :users, :path => '' do resources :questions end
This works and produces:
http://myapplication.com/peter/questions/how-do-i-create-urls
However if I try:
... resources :users, :path => '' do resources :questions, :path => '' end
Then things start to go wrong.
Is this the right approach and if so, can it be made to work with nested resources too?
Step 1 Add a Destroy-Resource Route As per the to: argument, the controller action to process such requests is TodosController#destroy . This route will use the todo path and URL helpers from the show-resource route, but with an additional method parameter as :delete . Important!
Running route helpers in the rails console is a great way of testing out routes to see what their exact output will be. Column 4 - This column shows the controller and action with a syntax of controller#action.
Considering the same case, the two terms can be differentiated in a simple way as :member is used when a route has a unique field :id or :slug and :collection is used when there is no unique field required in the route.
Rails RESTful Design which creates seven routes all mapping to the user controller. Rails also allows you to define multiple resources in one line.
The way you are doing it should work. I don't know what problem you are experiencing but if you copied the example code from your app directly then it might be because of the extra end
that you have put in your routes. It should probably look like this:
resource :users, :path => '' do resource :questions, :path => '' end
Another thing that could be the cause and that you need to be vary careful about is that these routes pretty much catches all requests and you should have them last in your routes.rb so that other routes matches first. Take this scenario for example:
resource :users, :path => '' do resource :questions, :path => '' end resources :posts
If you do it this way then no request will ever be routed to the Posts controller since a request to /posts/1 will be sent to the Questions controller with :user_id => 'posts', :id => 1
Edit:
Also, I now noticed that you use resource instead of resources. Don't know if that is intended or if it is a mistake.
Thanks to both @mark and @DanneManne for their help. With their input and a little more tweaking I got it all working. It's not exactly trivial but I'm not sure you could make it much shorter either:
Final working code
# setup the basic resources while holding some back for creation below resources :users, :except => [:show, :index, :new, :create], :path => '/' do resources :questions, :except => [:show] end # for clarity, pick out routes that would otherwise go # to root (such as new_user => '/new') resources :users, :only => [:index, :new, :create] # setup questions#show to give clean URLS match ':user_id/:question_id', :as => :user_question, :via => :get, :controller => :questions, :action => :show # setup users#show method to give clean URLS match ':user_id', :as => :user, :via => :get, :controller => :user, :action => :show
Rake Routes output
user_questions GET /:user_id/questions(.:format) {:action=>"index", :controller=>"questions"} POST /:user_id/questions(.:format) {:action=>"create", :controller=>"questions"} new_user_question GET /:user_id/questions/new(.:format) {:action=>"new", :controller=>"questions"} edit_user_question GET /:user_id/questions/:id/edit(.:format) {:action=>"edit", :controller=>"questions"} user_question PUT /:user_id/questions/:id(.:format) {:action=>"update", :controller=>"questions"} DELETE /:user_id/questions/:id(.:format) {:action=>"destroy", :controller=>"questions"} edit_user GET /:id/edit(.:format) {:action=>"edit", :controller=>"users"} user PUT /:id(.:format) {:action=>"update", :controller=>"users"} DELETE /:id(.:format) {:action=>"destroy", :controller=>"users"} users GET /users(.:format) {:action=>"index", :controller=>"users"} POST /users(.:format) {:action=>"create", :controller=>"users"} new_user GET /users/new(.:format) {:action=>"new", :controller=>"users"} user_question GET /:user_id/:question_id(.:format) {:controller=>"questions", :action=>"show"} user GET /:user_id(.:format) {:controller=>"user", :action=>"show"}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With