2012-02-08 21 views
41

¿Cuál es la diferencia lógica entre resource y resources métodosdiferencia entre los métodos de recursos y recursos

Aquí está algunos ejemplos:

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 

Parece método resource no crea ruta para index y ayudantes de algunos casos son diferentes (new_order y new_orders). ¿Por qué?

Respuesta

38

En realidad tienes razón, resource no debe crear una acción de índice, a menos que pide la acción index de forma explícita, de esta manera:

resource :orders, :only => [:index, :create, :show] 

ayudantes deben diferir también, pero no tanto como en el ejemplo, debido a que la convención es utilizar una forma singular con el método resource, y el plural con 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 

y la diferencia lógica es declarar que, lógicamente, no puede tener el plural de recurso en su una pp, por ejemplo Admin o lo que sea

+2

Creo que te refieres a la primera línea para decir 'resource: orders,: only ...' – mmcrae

+0

"Los ayudantes también deberían diferir": significa que obtienes 'new_order_path' for' resources' y 'new_orders_path' for' resource '. – Adobe

+0

La principal diferencia no es solo la página de índice. - ** resources ** creará rutas con página de índice y también requerirá: parámetro id para editar, actualizar, destruir y mostrar acciones ([Check] http://guides.rubyonrails.org/routing.html#specifying -a-controller-to-use) - ** resource ** creará las mismas rutas sin ruta de índice y sin necesidad: id param. ([Comprobar] http://guides.rubyonrails.org/routing.html#singular-resources) – stopanko

91

En un nivel alto, la intención de resource es declarar que solo uno de estos recursos existirá alguna vez. Por ejemplo:

resource :profile, :only => [:edit, :update] 

Como usuario, solo debería poder actualizar mi propio perfil. Nunca podré editar los perfiles de otros usuarios, por lo que no es necesario un esquema de URL como /users/1/profile/edit. En su lugar, utilizo /profile/edit, y el controlador sabe usar la ID del usuario actual en lugar de la ID que pasó en la URL (ya que no hay ninguna).

Es por eso que no obtienes una acción index con resource: solo hay un recurso, por lo que no tiene sentido "enumerarlos".

+0

¡Interesante! Gracias por esta esclarecedora explicación. ¿Esto significa que tenemos un controlador de perfil que será diferente de un controlador de usuario? Además, si quiero que la URL se vea como '/ profile/settings', puedo usar' collection {get 'settings'} ' – Agent47DarkSoul

Cuestiones relacionadas