2009-03-31 7 views
8

में एसटीआई कक्षा के बेस क्लास के लिए मार्ग प्राप्त करें कहें कि मेरे पास 3 मॉडल, व्यक्ति, स्थान और चीज के साथ रेल ऐप है। कहें कि चीज एकल टेबल विरासत का उपयोग करती है, इसलिए फैंसीटिंग और डरावनी उप-वर्ग हैं। फिर map.resources :people, :places, :things के साथ परिभाषित मार्ग हैं। तो फैंसी थिंग्स और डरावनी चीजों के लिए कोई नियंत्रक नहीं हैं, चीजें कंट्रोलर या तो हैंडल करता है।रेल

अब कहें कि मुझे कोड होना चाहिए जो किसी भी सूची की सूची दिखाता है, उनके लिए लिंक हैं। अगर मैं मेरे विचार में इस कोड है:

<% @items.each do |item| %> 
    <%= link_to item.name, item %> 
<% end %> 

हैं आइटम एक व्यक्ति या एक जगह है, यह ठीक काम करता है, polymorphic_path सही मार्ग पैदा करने का ख्याल रखता है। लेकिन अगर आइटम एक फैंसीटिंग या डरावनी चीज है, तो यह उड़ाता है, क्योंकि यह fancy_thing_path का उपयोग करने का प्रयास करेगा, जिसके लिए कोई रास्ता नहीं है। मैं किसी भी तरह इसे thing_path का उपयोग करना चाहता हूं। आदर्श रूप से थिंग और/या इसके उप-वर्गों पर एक विधि होगी जो किसी भी तरह से इंगित करता है कि उप-वर्गों को मार्ग उत्पन्न करने के लिए बेस क्लास का उपयोग करना चाहिए। क्या इसका कोई शानदार समाधान है?

+0

यह रेल विकास पर एक [खुला टिकट] (http://dev.rubyonrails.org/ticket/10454) है। इसके साथ निपटने के सुझावों के लिए टिकट देखें। – MarkusQ

उत्तर

12

इस चाल करना होगा:

<% @items.map {|i| if i.class < Thing then i.becomes(Thing) else i end}.each do |item| %> 
    <%= link_to item.name, item %> 
<% end %> 

यह ActiveRecord समारोह "हो जाता है" का उपयोग करता है करने के लिए इन मार्गों का उपयोग करना, आप की तरह यूआरएल के साथ खत्म हो जाएगा चीज बेस क्लास में चीज के सभी उप-वर्गों का "अप-कास्ट"।

+0

अच्छा, मुझे नहीं पता था, धन्यवाद! – pjb3

+0

यह समाधान लगभग 10x सुरुचिपूर्ण है जैसा कि मैं उम्मीद कर रहा था। –

8

map.resources :things 
map.resources :fancy_things, :controller => 'things' 
map.resources :scary_things, :controller => 'things' 
+1

+1 दो कारणों से 1) यह मेरे लिए काम करता है। 2) यह उत्तर @ pjb3 द्वारा स्वीकार किए गए एक से अधिक ड्रायर दिखता है। धन्यवाद। – Rohit

+0

यह समाधान काम करता है, लेकिन नीचे की तरफ है कि यह वर्ग/प्रकार को लागू नहीं करता है, उदा। यदि आप http: // localhost: 3000/fancy_things/21 के माध्यम से किसी आईडी से पूछते हैं और वह आइटम वास्तव में किसी अन्य उप-श्रेणी डरावनी चीज़ों से है, तो आपको अभी भी एक वैध प्रतिक्रिया मिल जाएगी। यह वास्तव में एक त्रुटि देनी चाहिए, क्योंकि यह वर्ग FancyThings के वर्ग नहीं है। – Tilo

0

का उपयोग कर एक सही जवाब नहीं है की कोशिश करें, लेकिन कम से कम मैं इस समस्या को गैर सूखी कोड का उपयोग कर के साथ सौदा कर सकते हैं:

map.resources: बातें,: has_many => : सामान map.resources: fancy_things,: नियंत्रक => 'बातें',: has_many =>: सामान map.resources: scary_things,: नियंत्रक => 'बातें',: has_many =>: सामान

आशा मुद्दे को जल्द ही किनारे में ठीक किया जाएगा, क्योंकि मैं देखना चाहता हूं fancy_things केवल द्वारा प्रबंधित: चीजें नियंत्रक।/Fancy_things/1 जबकि आप शायद चाहते हैं/बातें/1