2011-02-24 23 views
8

मेरे पास सिंगल टेबल विरासत के माध्यम से 2 अन्य लोगों द्वारा प्राप्त बेस क्लास है। मैं सभी उप-वर्गों को विभिन्न कारणों से एक ही नियंत्रक/विचार साझा करना चाहता हूं- मॉडल की कार्यक्षमता में केवल वास्तविक अंतर ही है।सिंगल कंट्रोलर, एकाधिक (विरासत) कक्षाएं (रेल 3)

हालांकि, जब मैं लिंक_to "सामान" का उपयोग करने का प्रयास करता हूं, example_of_child मुझे सही पृष्ठ खोजने में असमर्थ होने के बारे में शिकायतें मिलती हैं।

मैंने मैच '/ subclass' => रीडायरेक्ट ('/ parent') के साथ गड़बड़ करने का प्रयास किया है, लेकिन यह अजीब लिंक उत्पन्न करता है जो कोई समझ नहीं आता है। कोई सुझाव? मैं रेल में बहुत नया हूं, और मैं मानता हूं कि मार्गों की मेरी समझ अभी भी सीमित है-हालांकि, मुझे पूरी तरह से यकीन नहीं है कि मुझे यह भी देखना चाहिए कि मुझे कहाँ दिखना चाहिए।

उत्तर

12

http://www.alexreisner.com/code/single-table-inheritance-in-rails से:

क्या तुमने कभी मौजूदा रेल आवेदन आप शायद जानते हैं कि आपके LINK_TO के कई और form_for तरीकों त्रुटियों फेंक एक को एसटीआई जोड़ने के लिए जब आप एक माता पिता के वर्ग को जोड़ने की कोशिश की है, तो । ऐसा इसलिए है क्योंकि एक्शनपैक को अपने पथ और यूआरएल को निर्धारित करने के लिए किसी ऑब्जेक्ट की कक्षा को देखता है, और आपके पास अपने नए उप-वर्गों के लिए मैप किए गए मार्ग नहीं हैं। तुम इतनी तरह मार्गों में जोड़ सकते हैं, हालांकि मैं इसकी सलाह नहीं देते:

# NOT recommended: 
map.resources :cars,  :as => :vehicles, :controller => :vehicles 
map.resources :trucks,  :as => :vehicles, :controller => :vehicles 
map.resources :motorcycles, :as => :vehicles, :controller => :vehicles 

यह केवल एक विशेष लक्षण कम हो। अगर हम form_for का उपयोग करते हैं, तो हमारे फॉर्म फ़ील्ड्स के पास अभी भी नाम नहीं होंगे, उदाहरण के लिए पैराम [: वाहन] [: रंग] पैराम्स [: color] के बजाय हम उम्मीद करते हैं। इसके बजाय, हमें की रूट पर हमला करना चाहिए ताकि हमारे माता-पिता वर्ग में मॉडल_नाम विधि लागू हो सके। मैं के लिए किसी भी प्रलेखन इस तकनीक नहीं देखा है, तो यह बहुत अनौपचारिक है, लेकिन यह समझ में आता है और यह रेल में मेरे लिए पूरी तरह से काम करता है 2.3 और 3:

def self.inherited(child) 
    child.instance_eval do 
    def model_name 
     Vehicle.model_name 
    end 
    end 
    super 
end 

यह शायद भ्रामक लगता है, इसलिए जाने मुझे समझाने:

जब आप एक यूआरएल पैदा विधि फोन (जैसे: LINK_TO ("कार", कार)), ActionPack कॉल मोड दिए गए ऑब्जेक्ट (यहां कार) की कक्षा पर l_name। यह एक विशेष प्रकार की स्ट्रिंग देता है जो निर्धारित करता है कि ऑब्जेक्ट को URL में कहा जाता है। सभी हम यहाँ कर रहे हैं वाहन तो ActionPack माता पिता वर्ग (वाहन) से संबंधित के रूप कार, ट्रक, और मोटर साइकिल उपवर्गों देखेंगे, और इस तरह माता पिता वर्ग के नामित रास्तों का उपयोग की उपवर्गों के लिए MODEL_NAME विधि अधिभावी है (वाहन नियंत्रक) जहां भी यूआरएल उत्पन्न होते हैं। यह सब मानते हैं कि आप रेल संसाधन संसाधन (रीस्टफुल) यूआरएल का उपयोग कर हैं। (यदि आप नहीं हैं, तो कृपया करें।)

MODEL_NAME मंगलाचरण जांच करने के लिए अपने आप को, ActionController :: RecordIdentifier # model_name_from_record_or_class विधि के लिए रेल स्रोत कोड देखें। रेल 2.3 में विशेष स्ट्रिंग यह मैं वास्तव में क्या देख रहा था है यह एक ActiveModel है ActiveSupport :: ModelName का एक उदाहरण, रेल 3 में है :: नाम

+0

। रूटिंग टेबल के साथ मेसिंग खराब कामकाज की तरह लग रहा था, और हाँ, मैंने देखा था कि यह मेरे रूपों को गड़बड़ कर रहा था। इसलिए, मेरे वर्ग के नाम को फिट करने के लिए ऊपर दिए गए उदाहरण के लिए थोड़ा सा संशोधन के साथ, आपके समाधान ने मेरी परेशानियों का समाधान किया। आपको पता नहीं है कि मैं उन अतिरिक्त नियंत्रकों को बनाने/बनाए रखने में कितना डर ​​रहा था। – user632657

+0

इसे सुनकर खुशी हुई! :) –

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