web-dev-qa-db-fra.com

Différence entre les ressources et les méthodes de ressources

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?

46
alexkv

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

43
alony

À 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".

97
Brandan