2012-02-08 24 views
41

resource और resources तरीकोंअंतर

यहाँ के बीच तार्किक क्या अंतर है कुछ उदाहरण है:

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 

यह में विधि resourceindex के लिए मार्ग का निर्माण नहीं करता है, और सहायकों की तरह दिखता है कुछ मामले अलग हैं (new_order और new_orders)। क्यूं कर?

उत्तर

38

वास्तव में आप ठीक कह रहे हैं resource एक सूचकांक कार्रवाई नहीं बनाना चाहिए, जब तक आप स्पष्ट, इस तरह से सूचकांक कार्रवाई के लिए पूछना,:,

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

सहायकों को भी अलग होना चाहिए, लेकिन ऐसा नहीं है कि ज्यादा अपने उदाहरण के रूप में सम्मेलन अपने एक में संसाधन के लिए resource विधि के साथ एक विलक्षण रूप, और 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 

साथ बहुवचन और तार्किक अंतर उपयोग करने के लिए आप तार्किक रूप से घोषित करने के लिए है बहुवचन नहीं हो सकता है, क्योंकि पीपी, उदाहरण के लिए व्यवस्थापक या जो भी

+2

मुझे लगता है कि आपका मतलब है 'संसाधन: ऑर्डर, केवल ...' – mmcrae

+0

"हेल्पर्स को भी अलग होना चाहिए": इसका मतलब है कि आपको 'संसाधन' के लिए 'new_order_path' और' new_orders_path' 'संसाधन के लिए मिलता है '। – Adobe

+0

मुख्य अंतर सिर्फ सूचकांक पृष्ठ नहीं है। - ** संसाधन ** इंडेक्स पेज के साथ मार्ग बनाएंगे और इसके लिए भी आवश्यकता होगी: क्रिया पैरामीटर को संपादित, अपडेट, नष्ट और दिखाने के लिए आईडी पैरामीटर ([चेक] http://guides.rubyonrails.org/routing.html#specifying -ए-कंट्रोलर-टू-यूज) - ** संसाधन ** इंडेक्स रूट के बिना समान रूट बनाएगा और बिना आवश्यक: आईडी param। ([जांचें] http://guides.rubyonrails.org/routing.html#singular-resources) – stopanko

91

उच्च स्तर पर, resource का इरादा यह घोषित करना है कि इनमें से केवल एक संसाधन मौजूद होगा। उदाहरण के लिए:

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

उपयोगकर्ता के रूप में, मुझे केवल अपनी प्रोफ़ाइल अपडेट करने में सक्षम होना चाहिए। मुझे कभी भी अन्य उपयोगकर्ताओं की प्रोफाइल संपादित करने में सक्षम नहीं होना चाहिए, इसलिए /users/1/profile/edit जैसी यूआरएल योजना की कोई आवश्यकता नहीं है। इसके बजाय, मैं /profile/edit का उपयोग करता हूं, और नियंत्रक यूआरएल में पारित आईडी की बजाय वर्तमान उपयोगकर्ता की आईडी का उपयोग करना जानता है (क्योंकि कोई नहीं है)।

यही कारण है कि आपको indexresource के साथ कार्रवाई नहीं मिलती है: केवल एक संसाधन है, इसलिए उन्हें "लिस्टिंग" में कोई समझ नहीं है।

+0

दिलचस्प! इस रोशनी स्पष्टीकरण के लिए धन्यवाद। तो इसका मतलब है कि हमारे पास प्रोफाइल नियंत्रक है जो उपयोगकर्ता नियंत्रक से अलग होगा? अगर मैं यूआरएल को '/ प्रोफाइल/सेटिंग्स' जैसा दिखाना चाहता हूं, तो मैं 'संग्रह {get' सेटिंग्स '} का उपयोग कर सकता हूं – Agent47DarkSoul