Quelle est la différence logique entre les méthodes resource
et resources
Voici quelques exemples:
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
Il semble que la méthode resource
ne crée pas de route pour index
, et les assistants dans certains cas sont différents (new_order et new_orders). Pourquoi?
En fait, vous avez raison, resource
ne doit pas créer une action d'index, sauf si vous demandez explicitement l'action d'index, de cette façon:
resource :orders, :only => [:index, :create, :show]
Les assistants doivent également différer, mais pas autant que dans votre exemple, car la convention consiste à utiliser une forme singulière avec la méthode resource
, et le pluriel avec la 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
Et la différence logique est de déclarer que vous ne pouvez logiquement pas avoir le pluriel pour ressource dans votre application, par exemple Admin ou autre
À un niveau élevé, l'intention de resource
est de déclarer qu'une seule de ces ressources existera jamais. Par exemple:
resource :profile, :only => [:edit, :update]
En tant qu'utilisateur, je ne devrais pouvoir mettre à jour que mon propre profil. Je ne devrais jamais être en mesure de modifier les profils des autres utilisateurs, donc il n'y a pas besoin d'un schéma d'URL comme /users/1/profile/edit
. Au lieu de cela, j'utilise /profile/edit
, et le contrôleur sait utiliser l'ID de l'utilisateur actuel plutôt que l'ID transmis dans l'URL (car il n'y en a pas).
C'est pourquoi vous n'obtenez pas d'action index
avec resource
: il n'y a qu'une seule ressource, donc il n'y a aucun sens à les "lister".