มุมมองทางรถไฟของฉันและตัวควบคุมจะเกลื่อนไปด้วยredirect_to
, link_to
และform_for
วิธีการโทร บางครั้งlink_to
และredirect_to
ชัดเจนในเส้นทางที่พวกเขากำลังเชื่อมโยง (เช่นlink_to 'New Person', new_person_path
) แต่หลายครั้งที่เส้นทางมีความหมายโดยนัย (เช่นlink_to 'Show', person
)
ฉันเพิ่มการสืบทอดตารางเดี่ยว (STI) ลงในแบบจำลองของฉัน (พูดEmployee < Person
) และวิธีการทั้งหมดเหล่านี้แตกสำหรับอินสแตนซ์ของคลาสย่อย (พูดEmployee
); เมื่อรางรันก็มีข้อผิดพลาดlink_to @person
undefined method employee_path' for #<#<Class:0x000001022bcd40>:0x0000010226d038>
Rails กำลังค้นหาเส้นทางที่กำหนดโดยชื่อคลาสของวัตถุซึ่งเป็นพนักงาน เส้นทางของพนักงานเหล่านี้ไม่ได้ถูกกำหนดไว้และไม่มีตัวควบคุมพนักงานดังนั้นการกระทำที่ไม่ได้กำหนดไว้
คำถามนี้ถูกถามมาก่อน:
- ที่StackOverflowคำตอบคือการแก้ไขทุก ๆ อินสแตนซ์ของ link_to ฯลฯ ในโค๊ดฐานทั้งหมดของคุณและระบุพา ธ อย่างชัดเจน
- ในStackOverflowอีกสองคนแนะนำให้ใช้
routes.rb
ในการแมปทรัพยากรคลาสย่อยกับผู้ปกครองระดับ (map.resources :employees, :controller => 'people'
) คำตอบที่ดีที่สุดในคำถาม SO เดียวกันนั้นแสดงให้เห็นถึงการหล่อแบบวัตถุทุกอินสแตนซ์ใน codebase ใช้.becomes
- อีกคำหนึ่งที่StackOverflowคำตอบที่ดีที่สุดคือวิธีในค่าย Do Repeat Yourself และแนะนำให้สร้าง scaffolding ซ้ำสำหรับทุกคลาสย่อย
- นี่คือคำถามเดียวกันอีกครั้งที่ SO ซึ่งคำตอบยอดนิยมดูเหมือนจะผิด (Rails magic Just Works!)
- ที่อื่นบนเว็บฉันพบโพสต์บล็อกนี้ที่ F2Andy แนะนำให้แก้ไขในเส้นทางทุกที่ในรหัส
- ในบล็อกโพสต์Single Table Inheritance และ RESTful Routesที่ Logical Reality Design ขอแนะนำให้แมปทรัพยากรสำหรับคลาสย่อยกับตัวควบคุม superclass ดังเช่นในคำตอบข้อที่ 2 ข้างต้น
- อเล็กซ์ Reisner มีการโพสต์เดี่ยวตารางมรดกในรางที่เขาสนับสนุนการต่อต้านการทำแผนที่ทรัพยากรของการเรียนเด็กกับผู้ปกครองชั้นใน
routes.rb
ตั้งแต่ที่จับเฉพาะเส้นทางจากเหวอะหวะlink_to
และแต่ไม่ได้มาจากredirect_to
form_for
ดังนั้นเขาจึงแนะนำให้เพิ่มวิธีการในคลาสผู้ปกครองเพื่อให้คลาสย่อยนั้นเกี่ยวกับคลาสของพวกเขา เสียงดีundefined local variable or method `child' for #
แต่วิธีการของเขาให้ฉันข้อผิดพลาด
ดังนั้นคำตอบที่ดูเหมือนว่าสง่างามมากที่สุดและมีความเห็นมากที่สุด ( แต่ก็ไม่ทั้งหมดที่สง่างามหรือว่าฉันทามติมาก) routes.rb
คือการเพิ่มทรัพยากรที่จะของคุณ form_for
ยกเว้นนี้ไม่ได้ทำงานให้กับ ฉันต้องการความชัดเจน! เพื่อกลั่นตัวเลือกข้างต้นตัวเลือกของฉันคือ
- แมปทรัพยากรของคลาสย่อยกับตัวควบคุมของซูเปอร์คลาสใน
routes.rb
(และหวังว่าฉันไม่จำเป็นต้องเรียก form_for บนคลาสย่อยใด ๆ ) - แทนที่วิธีการภายในรางเพื่อให้ชั้นเรียนอยู่ซึ่งกันและกัน
- แก้ไขทุกอินสแตนซ์ในรหัสที่มีการเรียกใช้พา ธ ไปยังการกระทำของวัตถุโดยปริยายหรืออย่างชัดเจนไม่ว่าจะเป็นการเปลี่ยนเส้นทางหรือการพิมพ์วัตถุ
ด้วยคำตอบที่ขัดแย้งกันเหล่านี้ฉันต้องการคำวินิจฉัย ดูเหมือนว่าฉันจะไม่มีคำตอบที่ดี นี่เป็นความล้มเหลวในการออกแบบรางหรือไม่? ถ้าเป็นเช่นนั้นเป็นข้อผิดพลาดที่อาจได้รับการแก้ไขหรือไม่ หรือถ้าไม่ฉันก็หวังว่าจะมีใครบางคนสามารถกำหนดฉันให้ตรงกับสิ่งนี้เดินผ่านฉันผ่านข้อดีและข้อเสียของแต่ละตัวเลือก (หรืออธิบายว่าทำไมจึงไม่ใช่ตัวเลือก) และเป็นคำตอบที่ถูกต้อง หรือมีคำตอบที่ถูกที่ฉันไม่พบในเว็บ?