Routing in Ruby on Rails is a powerful feature that allows you to direct incoming web requests to the appropriate controller and action. Understanding the different types of routes—Nested, Member, Collection, Namespace, Scope, and Customizable—can greatly enhance your ability to structure your application’s URL scheme efficiently. Let’s dive into each type with examples to illustrate their usage and differences.
Nested Routes
Nested routes are used to express a hierarchical relationship between resources. For instance, if you have a Post model that has many Comments, you might nest comments inside posts.
1
2
3
4
# config/routes.rb
resources :posts do
resources : comments
end
This will generate routes like:
/posts/:post_id/comments (index)
/posts/:post_id/comments/:id (show)
/posts/:post_id/comments/new (new)
Using nested routes helps to clearly define the relationship between resources in your URLs, making it evident that comments belong to a specific post.
Member Routes
Member routes are used when you need to add custom actions to a single resource instance. These routes act on a member of the collection.
1
2
3
4
5
6
# config/routes.rb
resources :posts do
member do
get 'preview'
end
end
This will generate a route like:
/posts/:id/preview (preview)
Here, preview is an action that acts on a specific post, identified by :id.
Collection Routes
Collection routes are used for actions that operate on the collection of resources as a whole, rather than a single member.
1
2
3
4
5
6
# config/routes.rb
resources :posts do
collection do
get 'recent'
end
end
This will generate a route like:
/posts/recent (recent)
The recent action operates on the entire collection of posts.
Namespace
Namespaces are used to group controllers under a specific module, often used for organizing code or creating admin interfaces.
1
2
3
4
# config/routes.rb
namespace :admin do
resources :posts
end
This will generate routes like:
/admin/posts (index)
/admin/posts/:id (show)
/admin/posts/new (new)
The controllers for these routes would be placed in the app/controllers/admin directory, e.g., Admin::PostsController.
Scope
The scope method allows you to add common path prefixes or constraints to a group of routes without changing the controller namespace.
1
2
3
4
# config/routes.rb
scope 'api/v1' do
resources :posts
end
This will generate routes like:
/api/v1/posts (index)
/api/v1/posts/:id (show)
Here, the routes are scoped under /api/v1, but the controllers are not placed under a specific module.
Customizable Routes
Customizable routes allow you to define routes manually, giving you complete control over the URL structure and the corresponding controller actions.
1
2
3
# config/routes.rb
get 'about', to: 'pages#about'
post 'signup', to: 'users#create'
This will generate routes like:
/about (handled by the about action in PagesController)
/signup (handled by the create action in UsersController)
Customizable routes are useful when you need specific URL patterns that don’t fit neatly into the resourceful routing conventions.
Understanding and utilizing these different types of routes in Ruby on Rails allows you to create a well-organized and intuitive URL structure for your application.