เนื่องจาก Rails มีโครงสร้างเป็น MVC จึงเป็นเรื่องปกติที่จะต้องใช้เฉพาะรุ่นมุมมองและคอนเทนเนอร์ของตัวควบคุมที่จัดเตรียมไว้ให้สำหรับคุณ สำนวนทั่วไปสำหรับผู้เริ่มต้น (และแม้กระทั่งโปรแกรมเมอร์ระดับกลางบางคน) จะยัดเยียดตรรกะทั้งหมดในแอปให้เป็นแบบจำลอง (คลาสฐานข้อมูล) ตัวควบคุมหรือมุมมอง
ในบางจุดมีบางคนชี้ให้เห็นกระบวนทัศน์ "แบบจำลองไขมันตัวควบคุมผอม" และผู้พัฒนาระดับกลางรีบเร่งทุกอย่างจากตัวควบคุมของพวกเขาและโยนมันลงในแบบจำลองซึ่งเริ่มกลายเป็นถังขยะใหม่สำหรับตรรกะแอปพลิเคชัน
ในความเป็นจริงแล้วความคิดที่ดี แต่คอนโทรลเลอร์ที่ผอมแห้งก็เป็นข้อแนะนำที่ดี แต่สิ่งที่พิสูจน์ได้ - การวางทุกอย่างไว้ในแบบจำลองไม่ใช่แผนการที่ดีที่สุดจริงๆ
ใน Ruby คุณมีสองตัวเลือกที่ดีสำหรับการทำให้สิ่งต่าง ๆ เป็นแบบแยกส่วน คำตอบที่ได้รับความนิยมพอสมควรคือเพียงใช้โมดูล (โดยปกติแล้วจะเก็บไว้ในlib
) ที่เก็บกลุ่มของวิธีการแล้วรวมโมดูลเข้าไปในคลาสที่เหมาะสม สิ่งนี้จะช่วยในกรณีที่คุณมีหมวดหมู่ของการทำงานที่คุณต้องการนำมาใช้ใหม่ในหลายคลาส แต่ที่ฟังก์ชันนั้นยังคงยึดติดอยู่กับคลาส
โปรดจำไว้ว่าเมื่อคุณรวมถึงโมดูลเข้าไปในชั้นเรียนเป็นวิธีการที่จะกลายเป็นวิธีการเช่นการเรียนเพื่อให้คุณยังคงจบลงด้วยระดับที่มีตันของวิธีการที่พวกเขากำลังจัดเพียงอย่างเป็นหลายไฟล์
วิธีแก้ปัญหานี้สามารถทำงานได้ดีในบางกรณี - ในกรณีอื่นคุณจะต้องคิดถึงการใช้คลาสในรหัสของคุณซึ่งไม่ใช่โมเดลมุมมองหรือตัวควบคุม
วิธีที่ดีในการคิดเกี่ยวกับเรื่องนี้คือ "หลักการความรับผิดชอบเดี่ยว" ซึ่งกล่าวว่าชั้นควรรับผิดชอบสิ่งเดียว (หรือจำนวนน้อย) โมเดลของคุณมีหน้าที่รับผิดชอบในการเก็บข้อมูลจากแอปพลิเคชันของคุณไปยังฐานข้อมูล ผู้ควบคุมของคุณมีหน้าที่รับคำขอและส่งคืนการตอบกลับที่มีศักยภาพ
หากคุณมีแนวคิดที่ไม่เหมาะสมอย่างเรียบร้อยในกล่องเหล่านั้น (วิริยะคำขอ / การจัดการการตอบสนอง) คุณอาจต้องการคิดเกี่ยวกับวิธีการที่คุณจะจำลองความคิดในคำถาม คุณสามารถจัดเก็บคลาสที่ไม่ใช่โมเดลในแอพ / คลาสหรือที่อื่นและเพิ่มไดเรกทอรีนั้นลงในโหลดพา ธ ของคุณโดยทำดังนี้
config.load_paths << File.join(Rails.root, "app", "classes")
หากคุณใช้ผู้โดยสารหรือ JRuby คุณอาจต้องการเพิ่มเส้นทางของคุณไปยังเส้นทางโหลดที่กระตือรือร้น:
config.eager_load_paths << File.join(Rails.root, "app", "classes")
บรรทัดล่างคือเมื่อคุณไปถึงจุดหนึ่งใน Rails ที่คุณพบว่าตัวเองถามคำถามนี้ถึงเวลาที่จะเพิ่มพูนการสับ Ruby ของคุณและเริ่มต้นการสร้างแบบจำลองชั้นเรียนที่ไม่ได้เป็นเพียงคลาส MVC ที่ Rails ให้คุณเป็นค่าเริ่มต้น
ปรับปรุง:คำตอบนี้ใช้กับ Rails 2.x และสูงกว่า