Difference between resource and resources methods
Actually you are right, resource
should not create an index action, unless you ask for the index action explicitly, this way:
resource :orders, :only => [:index, :create, :show]
Helpers should differ too, but not that much as in your example, because the convention is to use a singular form with the resource
method, and the plural with the resources
resources :orders
=> rake routes
orders GET /orders(.:format) orders#index
POST /orders(.:format) orders#create
new_order GET /orders/new(.:format) orders#new
edit_order GET /orders/:id/edit(.:format) orders#edit
order GET /orders/:id(.:format) orders#show
PUT /orders/:id(.:format) orders#update
DELETE /orders/:id(.:format) orders#destroy
resource :order
=> rake routes
order POST /order(.:format) orders#create
new_order GET /order/new(.:format) orders#new
edit_order GET /order/:id/edit(.:format) orders#edit
GET /order/:id(.:format) orders#show
PUT /order/:id(.:format) orders#update
DELETE /order/:id(.:format) orders#destroy
And the logical difference is to declare you logically can't have the plural for resource in your app, for example Admin or whatever
At a high level, the intent of resource
is to declare that only one of these resources will ever exist. For example:
resource :profile, :only => [:edit, :update]
As a user, I should only be able to update my own profile. I should never be able to edit other users' profiles, so there's no need for a URL scheme like /users/1/profile/edit
. Instead, I use /profile/edit
, and the controller knows to use the current user's ID rather than the ID passed in the URL (since there is none).
That's why you don't get an index
action with resource
: there's only one resource, so there's no sense in "listing" them.