Rails provides two closely related routing helpers — resource and resources — and although they look similar, they serve different purposes. Understanding the distinction between them is essential for designing clean, intention-revealing routes in a Rails application.
What Are resource and resources?
Both helpers are used in config/routes.rb to generate RESTful routes. The key difference lies in whether the resource is singular or plural, and that directly affects the URLs and controller actions Rails creates for you.
resources: Plural Resources
resources is the most commonly used helper. It represents a collection of objects, where each item has its own identifier (usually an id).
Example:
1
resources :articles
This generates the full set of RESTful routes:
| HTTP Verb | Path | Controller#Action |
|---|---|---|
| GET | /articles | articles#index |
| GET | /articles/new | articles#new |
| POST | /articles | articles#create |
| GET | /articles/:id | articles#show |
| GET | /articles/:id/edit | articles#edit |
| PATCH | /articles/:id | articles#update |
| DELETE | /articles/:id | articles#destroy |
You use resources when:
- There are many records
- Each record is accessed by an ID
- You need collection-level actions like
index
Typical examples include posts, comments, products, and users.
resource: Singular Resources
resource (singular) represents a single object that does not need an ID in the URL. Rails assumes there is only one instance of that resource per context (often per user).
Example:
1
resource :profile
This generates a smaller set of routes:
| HTTP Verb | Path | Controller#Action |
|---|---|---|
| GET | /profile/new | profiles#new |
| POST | /profile | profiles#create |
| GET | /profile | profiles#show |
| GET | /profile/edit | profiles#edit |
| PATCH | /profile | profiles#update |
| DELETE | /profile | profiles#destroy |
Notice what’s missing:
- No
indexroute - No
:idsegment in the URL
You use resource when:
- There is only one instance
- The resource is implicitly identified
- An
idwould be redundant
Common examples include user profiles, dashboards, shopping carts, or account settings.
Controller Naming Still Uses Plural
Even when using resource, Rails still expects a plural controller name:
1
2
resource :profile
# maps to ProfilesController
This keeps controller naming consistent across the framework.
Choosing the Right One
A good rule of thumb:
- Use
resourceswhen you can say: “There are many of these.” - Use
resourcewhen you can say: “There is only one of these per scope.”
For example:
- A user has many posts →
resources :posts - A user has one profile →
resource :profile
Why This Matters
Choosing between resource and resources is more than syntax — it communicates intent. Singular routes make your URLs cleaner, your controllers simpler, and your application easier to reason about.