2010-03-31 10 views
10

मैं इसी तरह के सवाल पता से पहले उत्तर दिया गया है - जैसे:रेल: स्कीनी कंट्रोलर बनाम फैट मॉडल, या क्या मुझे अपना कंट्रोलर एनोरेक्सिक बनाना चाहिए?

  • तर्क कहां जाना चाहिए
  • जहां कुछ कार्य करने के लिए, आदि

लेकिन मैं एक और अधिक विशिष्ट प्रश्न है - कैसे मुझे यह सिद्धांत लेना चाहिए: अपने नियंत्रक पतला रखें, अपना मॉडल वसा बनाएं!

उदाहरण के लिए मान लीजिए कि मैं सत्यापन डेटा के कई स्रोत हैं:

यहाँ एक उदाहरण है। एक अच्छा उदाहरण एक वीआईएन नंबर होगा - मैं निर्माता डेटा स्रोत, डीएमवी के डेटा स्रोत, मेरे स्थानीय डेटाबेस के खिलाफ इसे सत्यापित कर सकता हूं - यह देखने के लिए कि मेरे पास रिकॉर्ड पर क्या है। तो मेरे पास विन और vins_controller नामक एक मॉडल है। मॉडल के अंदर मैं 5 तरीकों:

  • check_against_local_db
  • check_against_dmv
  • check_against_car_maker_1
  • check_against_car_maker_2, आदि

मेरी नियंत्रक में आराम के साथ रखने, कार्रवाई शो में - मेरे पास है एक साधारण मामला कथन जो पैरा [: स्रोत] को देखता है, और निर्दिष्ट स्रोत पर आधारित - विशिष्ट चेक विधि को कॉल करेगा।

अब यहाँ सवाल यह है: मैं तर्क को नियंत्रित करता है कि जो डेटा स्रोत नियंत्रक में कॉल करने के लिए या मैं इसे नियंत्रक में बढ़ना चाहिए मॉडल करने के लिए और फिर बस (, विन स्रोत) check_vin की तरह कुछ करना छोड़ देना चाहिए?

क्या मुझे अपना नियंत्रक एनोरेक्सिक बनाना चाहिए?

संपादित

मैं @ जय-गोडसे की ओर से आधिकारिक जवाब देने के लिए इस स्विचिंग कर रहा हूँ (धन्यवाद - समय में यह एक अच्छा जवाब था)। 2010 से चीजें बहुत बदल गईं और इस सवाल को अभी भी कुछ विचार मिलते हैं - इसलिए उम्मीद है कि यह कुछ लोगों को सही दिशा में इंगित करेगा और उन्हें अपने कोड को सही तरीके से व्यवस्थित करने में मदद करेगा।

Trailblazer gem प्रश्न में वास्तव में प्रश्नों को हल करने में समस्याएं हल करती हैं।

उत्तर

2

आपको Trailblazer एक जाना चाहिए। यह रेल के शीर्ष पर एक पतली ढांचा है (वास्तव में, यह सभी रूबी ढांचे के साथ चलता है), यह एक सेवा परत, फॉर्म ऑब्जेक्ट्स, दृढ़ता और डोमेन कोड के बीच संकेत, और इसी तरह से शुरू करता है।

यह वास्तव में अपने सभी सॉफ्टवेयर घटक पतला रखने के लिए के रूप में यह आप और अधिक अमूर्त परतों है कि यह इतना आसान यह पता लगाने की जहां क्या डाल करने के लिए कर देता है में मदद करता है।

उदाहरण के लिए, जब आप के लिए फॉर्म ऑब्जेक्ट होता है तो आप अपने सत्यापन तर्क को नियंत्रक और मॉडल में क्यों दबाएंगे?

+1

मैं आधिकारिक जवाब देने के लिए इस स्विचन हूँ। चीजें 2010 से बहुत बदल गईं और इस सवाल को अभी भी कुछ विचार मिलते हैं - इसलिए उम्मीद है कि यह कुछ लोगों को सही दिशा में इंगित करेगा। Trailblazer वास्तव में अच्छी तरह से सवाल में लाई समस्याओं को संबोधित करता है। – konung

4

मैं अपने मॉडल में तर्क डालूंगा, खासकर यदि मैं टीडीडीइंग (और मैं हमेशा टीडीडी हूं, सिवाय इसके कि जब मैं नहीं करता हूं)। मॉडल का परीक्षण आमतौर पर नियंत्रक का परीक्षण करने से कहीं अधिक आसान होता है।

+0

यह भी है कि आप अपने नियंत्रकों में से प्रत्येक में मान्य करने के लिए की आवश्यकता नहीं है। – SeanJA

3

मुझे जिम्मेदारी के बारे में सोचकर इस तरह के प्रश्नों से संपर्क करना पसंद है। वीआईएन की पुष्टि के लिए इस मामले में "जिम्मेदार" क्या है? आदर्श। नियंत्रक बस पैरामीटर के साथ पास करने के लिए ... उपयोगकर्ता इनपुट के आधार पर "नियंत्रण" करने के लिए है।

यदि यह पूरी तरह से स्पष्ट नहीं है, तो इस बारे में सोचें: इस कोड को फिर से उपयोग करने की आवश्यकता होने पर कम से कम प्रभाव का कारण कहां रखा जाएगा? कहें ... यदि दो अलग-अलग नियंत्रकों में दो अलग-अलग कार्रवाइयां दोनों को वीआईएन सत्यापित करने की आवश्यकता है, तो क्या करने की आवश्यकता होगी?आप नियंत्रक में इस कोड को छोड़ दिया, तो आप अनिवार्य रूप से नए नियंत्रक में इसकी नक़ल करने के साथ-साथ होगा, लेकिन अगर आप मॉडल में रखा था, तो आप नये नियंत्रक से check_vin विधि है, और कोई कोड फोन करता हूँ नकल की आवश्यकता होगी। जिम्मेदारियों को असाइन करके जहां वे सबसे अधिक समझ में हैं, आपने अपने कोड की पुनः उपयोगिता में सुधार किया है।

+0

मुझे यह कहना पसंद है कि "नियंत्रक कोड HTTP क्लाइंट्स के लिए है" ... यदि आप डेस्कटॉप ऐप में मॉडल का फिर से उपयोग कर रहे हैं (hypothetically)? आमतौर पर यह कहता है कि कोड कहां जाना चाहिए। –

19

एक पुरानी कहावत है,

स्मार्ट डाटा संरचनाओं और गूंगा कोड एक बहुत अन्य तरीके से चारों ओर की तुलना में बेहतर काम करता है।

आपके द्वारा वर्णित सब कुछ इस बारे में है कि डेटा का एक टुकड़ा दूसरे से कैसे संबंधित है। यह स्वयं ही आपका संकेत है कि सत्यापन के साथ उन संबंधों के लिए तर्क मॉडल या डेटाबेस परत में होना चाहिए।

एक एनोरेक्सिक नियंत्रक अच्छी तरह से डिज़ाइन (स्मार्ट?) डेटा का संकेत है। मेरा अनुभव मुझे बताता है कि आपके डेटा को डिजाइन करने में जितना अधिक प्रयास किया जाता है, उतना ही कम कोड आपको लिखना होगा।

नियंत्रक इनपुट को पार्स करने, उपयुक्त मॉडल को कॉल करने और फिर आउटपुट स्वरूपित करने में सर्वोत्तम होते हैं।

+0

बहुत दिलचस्प है। मैं इस ... पढ़ लिया है और यह भी कि कहावत की उत्पत्ति ऊपर देखा है करने के लिए खुश हूँ: [कैथेड्रल और बाज़ार] (http://en.wikipedia.org/wiki/The_Cathedral_and_the_Bazaar) के लिए – dmonopoly

+0

+1 " * नियंत्रकों पार्स आदानों पर सबसे अच्छा कर रहे हैं, उपयुक्त मॉडल बुला, और फिर आउटपुट स्वरूपण। * " – Ish

2

यह params "पार्स", लेकिन सत्यापन मॉडल में किया जाना चाहिए करने के लिए नियंत्रक की जिम्मेदारी है।

मैं नियंत्रक पर कुछ इस तरह करना होगा:

@my_model = MyModel.new(:source => params[:source] ...) 
if(@my_model.valid?) 
    # treat valid model here (i.e. save the model and redirect to show) 
else 
    # treat validation error here (usually throw an error) 
end 

आपका नियंत्रक वास्तव में सिर्फ "पतला" हो जाएगा। वास्तव में "एनोरेक्सिक" नियंत्रकों के लिए, आप inherited_resources या resource_this पर एक नज़र रखना चाहेंगे। कुछ मामलों में ये आपको एक 3-लाइन नियंत्रक देगा, जो पूरे रीस्टफुल स्टैक को कार्यान्वित करेगा।

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