What is the logical difference between resource
and resources
methods
Here is some examples:
resource :orders, :only => [:index, :create, :show] > rake routes orders POST /orders(.:format) orders#create GET /orders(.:format) orders#show resources :orders, :only => [:index, :create, :show] > rake routes orders GET /orders(.:format) orders#index POST /orders(.:format) orders#create order GET /orders/:id(.:format) orders#show resource :orders > rake routes orders POST /orders(.:format) orders#create new_orders GET /orders/new(.:format) orders#new edit_orders GET /orders/edit(.:format) orders#edit GET /orders(.:format) orders#show PUT /orders(.:format) orders#update DELETE /orders(.:format) orders#destroy 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
It looks like method resource
does not create route for index
, and helpers in some cases are different (new_order and new_orders). Why?
Declaring a resource or resources generally corresponds to generating many default routes. resource is singular. resources is plural.
Difference between singular resource and resources in Rails routes. So far, we have been using resources to declare a resource. Rails also lets us declare a singular version of it using resource. Rails recommends us to use singular resource when we do not have an identifier.
Any object that you want users to be able to access via URI and perform CRUD (or some subset thereof) operations on can be thought of as a resource. In the Rails sense, it is generally a database table which is represented by a model, and acted on through a controller.
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.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With