Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to remove controller names from rails routes?

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?

like image 385
Peter Nixey Avatar asked Jun 16 '11 09:06

Peter Nixey


People also ask

How do I delete a route in rails?

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!

What is Route helper in Rails?

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.

What is member and collection routes in Rails?

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.

How many types of routes are there in Rails?

Rails RESTful Design which creates seven routes all mapping to the user controller. Rails also allows you to define multiple resources in one line.


2 Answers

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.

like image 116
DanneManne Avatar answered Sep 25 '22 10:09

DanneManne


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"} 
like image 25
Peter Nixey Avatar answered Sep 24 '22 10:09

Peter Nixey