Collection and member in Rails routes


Aug 02, 2022 | Ruby

Ruby on Rails (RoR) is a powerful framework for developing any type and complexity level of web applications. One thing that is super easy to do in RoR is routing.

What are routes in Ruby on Rails?

Routes are a way to redirect incoming requests to controllers and actions. It's that simple.
If you have a pages controller with index action, you can specify that in your routes like this:

Rails.application.routes.draw do
  get 'pages/index'
end

OK, what about collection and member? What are those?

A member route will require an ID, because it acts on a member. A collection route doesn't because it acts on a collection of objects.

Here are some examples.

Defining a member block in your routes:

Rails.application.routes.draw do
  resources :articles do
    member do
      get 'draft'
    end
  end
end

This block will generate a route looking like this:

get '/articles/:id/draft', to: 'articles#draft'
# draft_article_path

Defining a collection block in your routes:

Rails.application.routes.draw do
  resources :articles do
    collection do
      get 'search'
    end
  end
end

This will generate a route looking like this:

get '/articles/search', to: 'articles#search'
# search_articles_path

You don't have to define member and collection routes as blocks.
Here is another way of doing this:

resources :articles do
  get 'draft', on: :member
  get 'search', on: :collection
end