क्योंकि रेल MVC के संदर्भ में संरचना प्रदान करता है, यह केवल मॉडल, दृश्य और नियंत्रक कंटेनरों का उपयोग करके समाप्त होने के लिए स्वाभाविक है जो आपके लिए प्रदान किए जाते हैं। शुरुआती (और यहां तक कि कुछ मध्यवर्ती प्रोग्रामर) के लिए विशिष्ट मुहावरा ऐप में सभी तर्क को मॉडल (डेटाबेस वर्ग), नियंत्रक या दृश्य में क्रैम करना है।
किसी बिंदु पर, कोई व्यक्ति "वसा-मॉडल, पतला-नियंत्रक" प्रतिमान को इंगित करता है, और मध्यवर्ती डेवलपर्स जल्दबाजी में अपने नियंत्रकों से सब कुछ एक्साइज करते हैं और इसे मॉडल में फेंक देते हैं, जो एप्लिकेशन लॉजिक के लिए एक नया कचरा बन सकता है।
स्कीनी नियंत्रकों, वास्तव में, एक अच्छा विचार है, लेकिन कोरोलरी - मॉडल में सब कुछ डाल देना, वास्तव में सबसे अच्छी योजना नहीं है।
रूबी में, आपके पास चीजों को अधिक मॉड्यूलर बनाने के लिए कुछ अच्छे विकल्प हैं। एक काफी लोकप्रिय जवाब सिर्फ मॉड्यूल का उपयोग करना है (आमतौर पर धराशायी lib
) जो तरीकों के समूहों को पकड़ते हैं, और फिर मॉड्यूल को उचित वर्गों में शामिल करते हैं। यह उन मामलों में मदद करता है जहां आपके पास कार्यक्षमता की श्रेणियां हैं जिन्हें आप कई वर्गों में पुन: उपयोग करना चाहते हैं, लेकिन जहां कार्यक्षमता अभी भी वर्गों से जुड़ी हुई है।
याद रखें, जब आप एक वर्ग में एक मॉड्यूल शामिल करते हैं, तो विधियाँ वर्ग की विधियां बन जाती हैं, इसलिए आप अभी भी एक टन विधि वाले वर्ग के साथ समाप्त होते हैं, वे सिर्फ कई फाइलों में अच्छी तरह से व्यवस्थित होते हैं।
यह समाधान कुछ मामलों में अच्छी तरह से काम कर सकता है - अन्य मामलों में, आप अपने कोड में उन कक्षाओं का उपयोग करने के बारे में सोचना चाहते हैं जो मॉडल, विचार या नियंत्रक नहीं हैं।
इसके बारे में सोचने का एक अच्छा तरीका "एकल जिम्मेदारी सिद्धांत" है, जो कहता है कि एक वर्ग को एक (या छोटी संख्या) चीजों के लिए जिम्मेदार होना चाहिए। आपके एप्लिकेशन डेटाबेस से डेटा को बनाए रखने के लिए आपके मॉडल जिम्मेदार हैं। आपके नियंत्रक एक अनुरोध प्राप्त करने और एक व्यवहार्य प्रतिक्रिया वापस करने के लिए जिम्मेदार हैं।
आप अवधारणाओं है कि उन बक्से (हठ, अनुरोध / प्रतिक्रिया प्रबंधन) में बड़े करीने से फिट नहीं है है, तो आप शायद कैसे आप के बारे में सोचने के लिए चाहते हैं सवाल में विचार मॉडल। आप गैर-मॉडल कक्षाओं को ऐप / कक्षाओं में, या कहीं और स्टोर कर सकते हैं, और उस निर्देशिका को अपने लोड पथ पर जोड़कर कर सकते हैं:
config.load_paths << File.join(Rails.root, "app", "classes")
यदि आप यात्री या JRuby का उपयोग कर रहे हैं, तो आप संभवतः अपने पथ को उत्सुक लोड पथों में जोड़ना चाहते हैं:
config.eager_load_paths << File.join(Rails.root, "app", "classes")
लब्बोलुआब यह है कि एक बार जब आप रेल में एक बिंदु पर पहुंच जाते हैं, जहां आप अपने आप को यह सवाल पूछते हैं, तो यह समय है कि आप अपनी रूबी चॉप्स को बीफ करें और मॉडलिंग कक्षाएं शुरू करें जो केवल एमवीसी कक्षाएं नहीं हैं जो रेल आपको डिफ़ॉल्ट रूप से देती हैं।
अद्यतन: यह उत्तर रेल पर लागू होता है 2.x और उच्चतर।