2010-07-27 10 views
10

मार्ग मैं दो वर्गों है:रेल 3 has_one

class User < ActiveRecord::Base 
    :has_one :foo 
end 

class Foo < ActiveRecord::Base 
    :belongs_to :user 
end 

फू वैकल्पिक है।

resources :users do 
    resources :foo 
end 

निम्नलिखित में से कौन मार्गों में परिणाम:

GET /users/:user_id/foo(.:format)    {:controller=>"foos", :action=>"index"} 
user_foos POST /users/:user_id/foo(.:format)    {:controller=>"foos", :action=>"create"} 
new_user_foo GET /users/:user_id/foo/new(.:format)   {:controller=>"foos", :action=>"new"} 
GET /users/:user_id/foo/:id(.:format)   {:controller=>"foos", :action=>"show"} 
PUT /users/:user_id/foo/:id(.:format)   {:controller=>"foos", :action=>"update"} 
user_foo DELETE /users/:user_id/foo/:id(.:format)   {:controller=>"foos", :action=>"destroy"} 
edit_user_foo GET /users/:user_id/foo/:id/edit(.:format)  {:controller=>"foos", :action=>"edit"} 

सवाल:

  1. यह सूचकांक की तरह लगता है और दिखाएँ कार्यों निरर्थक हैं

    मैं निम्नलिखित मार्ग बनाया। उनमें से एक को हटा दिया जाना चाहिए? यदि हां, तो कौन सा?

  2. : दिखाएँ कार्रवाई में आईडी पैरामीटर अनावश्यक लगता है, क्योंकि user_id foos तालिका में एक विदेशी कुंजी है और प्रति उपयोगकर्ता केवल एक foo है। क्या मैं गलत हूँ?
  3. यदि कोई फू नहीं है तो मैं नई कार्रवाई के मार्ग के लिए एक शानदार तरीका प्राप्त करना चाहता हूं। एक विकल्प @ user.foo.nil का परीक्षण करना होगा? FooController के शो या इंडेक्स एक्शन में, फिर नई कार्रवाई पर रीडायरेक्ट करें। क्या कोई बेहतर तरीका है?

आपके समय के लिए धन्यवाद।

उत्तर

25

यदि आपके मॉडल में हैसोन एसोसिएशन है, तो resource :foo का उपयोग करके मार्ग सेट अप करने का प्रयास करें (एकवचन विधि नाम "संसाधन", "संसाधन" नहीं) को नोट करें। यह एक सिंगलटन संसाधन मार्ग स्थापित करेगा (जिसमें उदा। कोई इंडेक्स एक्शन नहीं है और सदस्य कार्रवाइयों में एक आईडी पैरा नहीं है क्योंकि केवल एक सदस्य है)। यह भी देखें http://apidock.com/rails/ActionController/Resources/resource (2.3 दस्तावेज, लेकिन 3.0 पर भी लागू होता है)।

+2

विश्वास नहीं कर सकता कि मुझे याद आया। – craig

+1

जानकारी के लिए धन्यवाद –

2

मैं समझ सकता हूं कि क्रेग वास्तव में क्यों चूक गया। यह इतना सूक्ष्म अंतर है कि यह मेरे दिमाग को पार नहीं कर पाया। मुझे छोड़ने वाली एकमात्र चीज यह है कि सिंगलटन संसाधन के लिए मेरे नामित मार्गों में एक अजीब इंडेक्स नाम है: user_foos के बजाय।

रेल के हिस्से में बहुवचन की अनुपस्थिति से यह वास्तव में एक स्मार्ट कटौती है।

चेतावनी: निम्न उदाहरण या तो ऐसा करके उथले नेस्टिंग का उपयोग करें:

resources :cats, shallow: true do 
    resources :noms 
end 

या कि:

resources :cats do 
    shallow do 
    resources :noms 
    end 
end 

वैसे भी वापस व्यापार करने, यदि आप सेटअप एक विलक्षण संसाधन - address उदाहरण के लिए articles के विपरीत - और आप इस तरह कुछ देखते हैं:

user_address_index GET | POST 
    new_user_address GET 
     edit_address GET 
      address GET | PUT | DELETE 

तब के रूप में एंड्रियास उचित रूप में बताया, तो आप शायद गलत तरीके से यह आपके मार्गों में घोषणा की:

resources :users do 
    resources :address 
end 

और अगर आप को बदलने कि करने के लिए:

resources :users do 
    resource :address 
end 

आप सब ठीक और खुश होना चाहिए और अगर आप rake routes को अपने प्रॉम्प्ट में पंच करते हैं तो इस तरह कुछ देखें:

 user_address POST | GET | PUT | DELETE 
new_user_address GET 
edit_user_address GET 

नोट: मुझे पता है कि रेक मार्गों का उत्पादन बिल्कुल इस तरह दिखता नहीं है (यह बहुत अधिक वर्बोज़ है), मैं फोकस के लिए बस सरलीकृत कर रहा हूं।

उम्मीद है कि मदद करता है।

संबंधित मुद्दे