Hi Friends,
In my previous blog Routes in Rails using Objects, I explained about using routes with objects. Today I am going to tell you about how we can customize the routes that are created using resources. As we know whenever we mention resources in routes it creates 7 routes for plural names and 6 for singular names  like this:
resources :articles
$ rake routes
      Prefix Verb   URI Pattern                  Controller#Action
    articles GET    /articles(.:format)          articles#index
             POST   /articles(.:format)          articles#create
 new_article GET    /articles/new(.:format)      articles#new
edit_article GET    /articles/:id/edit(.:format) articles#edit
     article GET    /articles/:id(.:format)      articles#show
             PATCH  /articles/:id(.:format)      articles#update
             PUT    /articles/:id(.:format)      articles#update
             DELETE /articles/:id(.:format)      articles#destroy
 
 resource :articles
$ rake routes
       Prefix Verb   URI Pattern              Controller#Action
     articles POST   /articles(.:format)      articles#create
 new_articles GET    /articles/new(.:format)  articles#new
edit_articles GET    /articles/edit(.:format) articles#edit
              GET    /articles(.:format)      articles#show
              PATCH  /articles(.:format)      articles#update
              PUT    /articles(.:format)      articles#update
              DELETE /articles(.:format)      articles#destroy
There are multiple ways we can customize these resource type routes. Some of them are:
a)  Using constraints:
Anyone can hit anything in a route but if we want the route to be constraint or in other words if we want to allow only specific type of string as an id. We can give a regex as a constraint in the routes like this. Suppose we want to allow only numeric digits in id we can specify the route as:
resources :articles, constraints: { id: /[0-9]+/ }
$ rake routes
      Prefix Verb   URI Pattern                  Controller#Action
    articles GET    /articles(.:format)          articles#index
             POST   /articles(.:format)          articles#create
 new_article GET    /articles/new(.:format)      articles#new
edit_article GET    /articles/:id/edit(.:format) articles#edit {:id=>/[0-9]+/}
     article GET    /articles/:id(.:format)      articles#show {:id=>/[0-9]+/}
             PATCH  /articles/:id(.:format)      articles#update {:id=>/[0-9]+/}
             PUT    /articles/:id(.:format)      articles#update {:id=>/[0-9]+/}
             DELETE /articles/:id(.:format)      articles#destroy {:id=>/[0-9]+/}
b) Overriding named helpers:
We can also modify the named helpers by overriding the as: option with the routes like this:
resources :articles
## By default all route helpers will contain article_path or articles_path.
resources :articles
resources :photos, as: 'blogs'
  $ rake routes
      Prefix Verb   URI Pattern                  Controller#Action
    articles GET    /articles(.:format)          articles#index
             POST   /articles(.:format)          articles#create
 new_article GET    /articles/new(.:format)      articles#new
edit_article GET    /articles/:id/edit(.:format) articles#edit
     article GET    /articles/:id(.:format)      articles#show
             PATCH  /articles/:id(.:format)      articles#update
             PUT    /articles/:id(.:format)      articles#update
             DELETE /articles/:id(.:format)      articles#destroy
       blogs GET    /photos(.:format)            photos#index
             POST   /photos(.:format)            photos#create
    new_blog GET    /photos/new(.:format)        photos#new
   edit_blog GET    /photos/:id/edit(.:format)   photos#edit
        blog GET    /photos/:id(.:format)        photos#show
             PATCH  /photos/:id(.:format)        photos#update
             PUT    /photos/:id(.:format)        photos#update
             DELETE /photos/:id(.:format)        photos#destroy
 
c) Change the path names for edit, new etc
We can update the method names in paths by overriding the :path_names option like this:
resources :articles, path_names: { new: 'brand_new' }
# so new will be replaced like
/articles/new  ==>  /articles/brand_new
d) Changing Named Route Parameters:
As we all now for edit update like actions the url for the resource is like:
/articles/:id/edit(.:format)
where the identifier is by default id but if we want to change it we can change it by changing the resource like:
resources :articles, param: :my_param
#=> route will be like
/articles/:my_param/edit(.:format)
e) Using only and except in routes:
As I told earlier that as soon as we add a resource in route it creates 6 (for singular) and 7 (for plural) routes for that resource, but we can use only and except options to restrict them
resources :articles, only: [:index, :create]
## will create routes for only index and create actions
## Similarly
resources :articles, except: [:update, :destroy, :edit]
## will create routes except update, destroy and edit actions
f) changing the controller name:
By default when routes are added, they use the same controller name as the resource but if we want the route to point to a different controller's action we can do so like this
resources :articles, controller: 'blogs'
$ rake routes
      Prefix Verb   URI Pattern                  Controller#Action
    articles GET    /articles(.:format)          blogs#index
             POST   /articles(.:format)          blogs#create
 new_article GET    /articles/new(.:format)      blogs#new
edit_article GET    /articles/:id/edit(.:format) blogs#edit
     article GET    /articles/:id(.:format)      blogs#show
             PATCH  /articles/:id(.:format)      blogs#update
             PUT    /articles/:id(.:format)      blogs#update
             DELETE /articles/:id(.:format)      blogs#destroy
Hope you liked this. For information related to rails routes go this link
http://guides.rubyonrails.org/routing.html
                       
                    
0 Comment(s)