मेरे रेल विचारों और नियंत्रकों से अटे पड़े रहे redirect_to
, link_to
और form_for
विधि कॉल। कभी कभी link_to
और redirect_to
रास्तों वे लिंक कर रहे हैं (उदाहरण के लिए में स्पष्ट कर रहे हैं link_to 'New Person', new_person_path
), लेकिन कई बार रास्तों निहित हैं (उदाहरण के लिए link_to 'Show', person
)।
मैं अपने मॉडल (कहना Employee < Person
) में कुछ एकल तालिका वंशानुक्रम (एसटीआई) जोड़ता हूं , और ये सभी विधियाँ उपवर्ग (उदाहरण) के उदाहरण के लिए टूट जाती हैं Employee
; जब रेल निष्पादित होती है link_to @person
, तो इसमें त्रुटि होती है undefined method employee_path' for #<#<Class:0x000001022bcd40>:0x0000010226d038>
। रेल वस्तु के वर्ग नाम से परिभाषित मार्ग की तलाश में है, जो कर्मचारी है। इन कर्मचारी मार्गों को परिभाषित नहीं किया गया है, और कोई भी कर्मचारी नियंत्रक नहीं है, इसलिए क्रियाएँ भी परिभाषित नहीं हैं।
यह प्रश्न पहले पूछा गया है:
- पर StackOverflow , जवाब अपने पूरे codebase में LINK_TO आदि के प्रत्येक उदाहरण संपादित करें, और स्पष्ट रूप से पथ राज्य के लिए है
- StackOverflow पर , दो लोग
routes.rb
मूल वर्ग (map.resources :employees, :controller => 'people'
) के लिए उपवर्ग संसाधनों का उपयोग करने का सुझाव देते हैं । उसी SO प्रश्न में शीर्ष उत्तर से पता चलता है कि कोडबेस में प्रत्येक इंस्टेंस ऑब्जेक्ट टाइप-कास्टिंग का उपयोग कर रहा है.becomes
- स्टैकऑवरफ्लो में एक और एक , टॉप रिप्लाई अपने आप को कैंप में करने का तरीका है, और हर उपवर्ग के लिए डुप्लिकेट मचान बनाने का सुझाव देता है।
- यहाँ एसओ पर फिर से वही सवाल है, जहां शीर्ष उत्तर सिर्फ गलत लगता है (रेल जादू बस काम करता है!)
- वेब पर कहीं भी, मुझे यह ब्लॉग पोस्ट मिला जहां F2Andy कोड में हर जगह पथ में संपादन की सिफारिश करता है।
- लॉजिकल रियलिटी डिज़ाइन में ब्लॉग पोस्ट सिंगल टेबल इनहेरिटेंस और रैस्टफुल रुट्स पर, उपवर्ग के लिए संसाधनों को सुपरक्लास कंट्रोलर को मैप करने की सिफारिश की गई है, जैसा कि एसओ उत्तर संख्या 2 में है।
- एलेक्स रीजनर के पास रेल्स में एक पोस्ट सिंगल टेबल इनहेरिटेंस है , जिसमें वह चाइल्ड क्लासेस के संसाधनों को पेरेंट क्लास में मैप करने की वकालत करता है
routes.rb
, क्योंकि वह केवल राउटिंग ब्रेक्जिट पकड़ता हैlink_to
औरredirect_to
उससे नहींform_for
। इसलिए वह उपवर्गों को अपनी कक्षा के बारे में झूठ बोलने के लिए मूल वर्ग में एक विधि जोड़ने की सलाह देता है। अच्छा लगता है, लेकिन उनकी पद्धति ने मुझे त्रुटि दीundefined local variable or method `child' for #
।
जवाब यह है कि सबसे सुंदर लगती है और सबसे आम सहमति है (लेकिन यह सब कुछ नहीं है तो यह है कि सुंदर, और न ही है कि बहुत आम सहमति), अपने लिए संसाधनों को जोड़ने है routes.rb
। इसके अलावा यह काम नहीं करता है form_for
। मुझे कुछ स्पष्टता चाहिए! उपरोक्त विकल्पों को डिस्टिल करने के लिए, मेरे विकल्प हैं
routes.rb
सुपरक्लास के नियंत्रक में उपवर्ग के संसाधनों को मैप करें (और मुझे किसी उपवर्ग पर form_for कॉल करने की आवश्यकता नहीं है)- कक्षाओं को एक-दूसरे से झूठ बनाने के लिए ओवरराइड आंतरिक तरीकों को पार करता है
- प्रत्येक उदाहरण को उस कोड में संपादित करें जहां किसी वस्तु की कार्रवाई के लिए पथ को स्पष्ट रूप से या स्पष्ट रूप से लागू किया जाता है, या तो पथ को बदलकर या ऑब्जेक्ट को टाइप-कास्टिंग किया जाता है।
इन सभी परस्पर विरोधी जवाबों के साथ, मुझे एक सत्तारूढ़ की आवश्यकता है। यह मुझे ऐसा लगता है जैसे कोई अच्छा जवाब नहीं है। क्या यह रेल के डिजाइन में विफल है? यदि हां, तो क्या यह एक बग है जो ठीक हो सकता है? या यदि नहीं, तो मुझे उम्मीद है कि कोई मुझे इस पर सीधे सेट कर सकता है, मुझे प्रत्येक विकल्प के पेशेवरों और विपक्षों के माध्यम से चलें (या समझाएं कि यह विकल्प क्यों नहीं है), और कौन सा सही उत्तर है, और क्यों। या क्या कोई सही उत्तर है जो मुझे वेब पर नहीं मिल रहा है?