2012-02-08 14 views
41

Qual è la differenza logica tra resource e resources metodidifferenza tra i metodi di risorse e di risorse

Ecco alcuni esempi:

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 

Sembra metodo resource non crea percorso per index, e aiutanti in alcuni casi sono diversi (new_order e new_orders). Perché?

risposta

38

In realtà hai ragione, resource non dovrebbe creare un'azione di indice, a meno che non si chiede per l'azione index esplicitamente, in questo modo:

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

Helpers dovrebbero differire troppo, ma non così tanto come nel tuo esempio, perché la convenzione è quello di usare una forma singolare con il metodo resource, e il plurale con il 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 

e la differenza logica è quella di dichiarare voi logicamente non può avere il plurale per la risorsa in un pp, ad esempio Amministratore o qualsiasi altro

+2

Penso che intendiate la prima riga per dire 'risorsa: ordini,: solo ...' – mmcrae

+0

"Gli helper dovrebbero differire anche loro": significa che si ottiene 'new_order_path' per' resources' e 'new_orders_path' per' resource '. – Adobe

+0

La differenza principale non è solo la pagina indice. - ** risorse ** creerà percorsi con la pagina indice e richiederà anche: parametro id per modificare, aggiornare, distruggere e mostrare azioni ([Controlla] http://guides.rubyonrails.org/routing.html#specifying -a-controller-to-use) - ** risorsa ** creerà gli stessi percorsi senza indicizzazione e senza richiesta: id param. ([Controlla] http://guides.rubyonrails.org/routing.html#singular-resources) – stopanko

91

Ad un livello elevato, l'intento di resource è dichiarare che solo una di queste risorse sarà mai esistita. Ad esempio:

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

Come utente, dovrei solo essere in grado di aggiornare il mio profilo. Non dovrei mai essere in grado di modificare i profili di altri utenti, quindi non è necessario uno schema URL come /users/1/profile/edit. Invece, io uso /profile/edit e il controller sa usare l'ID dell'utente corrente piuttosto che l'ID passato nell'URL (poiché non ce n'è).

Ecco perché non si ottiene un'azione index con resource: c'è una sola risorsa, quindi non ha senso inserirle in "elenco".

+0

Interessante! Grazie per questa spiegazione illuminante. Questo significa che abbiamo un controller di profilo che sarà diverso dal controller di un utente? Inoltre, se voglio che l'url assomigli a '/ profile/settings', posso usare' collection {get 'settings'} ' – Agent47DarkSoul

Problemi correlati