Ruby on Rails Routing Concerns


Example

To avoid repetition in nested routes, concerns provide a great way of sharing common resources that are reusable. To create a concern use the method concern within the routes.rb file. The method expects a symbol and block:

concern :commentable do
  resources :comments
end

While not creating any routes itself, this code allows using the :concerns attribute on a resource. The simplest example would be:

resource :page, concerns: :commentable

The equivalent nested resource would look like this:

resource :page do
  resource :comments
end

This would build, for example, the following routes:

/pages/#{page_id}/comments
/pages/#{page_id}/comments/#{comment_id}

For concerns to be meaningful, there must be multiple resources that utilize the concern. Additional resources could use any of the following syntax to call the concern:

resource :post, concerns: %i(commentable)
resource :blog do
  concerns :commentable
end