2008-09-13 10 views
149

रेल विकास पर रूबी (या सामान्य रूप से एमवीसी) में, तर्क देने के लिए मुझे किस त्वरित नियम का पालन करना चाहिए।रेल मॉडल, देखें, नियंत्रक, और सहायक: कहां जाता है?

सकारात्मक उत्तर दें - के साथ यहाँ, बजाय इस रखूँ नहीं डाल है कि वहाँ

उत्तर

164

MVC

नियंत्रक: कोड यहाँ रखो बाहर काम कर रहा होता है जिसे उपयोगकर्ता चाहता है, और निर्णय लेने से उन्हें देने के लिए क्या, बाहर है कि क्या वे में लॉग इन किया काम कर रहे हैं, चाहे वे कुछ डेटा देखना चाहिए के साथ क्या करना है, आदि।अंत में, नियंत्रक अनुरोधों को देखता है और यह बताता है कि कौन सा डेटा (मॉडल) दिखाना है और क्या प्रस्तुत करना है। यदि आपको संदेह है कि कोड नियंत्रक में जाना चाहिए या नहीं, तो शायद यह नहीं होना चाहिए। अपने नियंत्रक skinny रखें।

देखें: केवल देखने के लिए अपने डेटा (मॉडल) प्रदर्शित करने के लिए कम से कम कोड को शामिल करना चाहिए, यह प्रसंस्करण या की गणना के बहुत सारे ऐसा नहीं करना चाहिए, यह गणना की है (या संक्षेप) मॉडल से डेटा प्रदर्शित किया जाना चाहिए, या नियंत्रक से उत्पन्न किया गया। यदि आपके व्यू को वास्तव में प्रसंस्करण करने की आवश्यकता है जो मॉडल या नियंत्रक द्वारा नहीं किया जा सकता है, तो कोड को एक सहायक में रखें। एक दृश्य में रूबी कोड के बहुत सारे पृष्ठ पढ़ने के लिए कठिन मार्कअप बनाता है।

मॉडल: अपने मॉडल होना चाहिए जहां सभी अपने कोड है कि आपके डेटा से संबंधित है (संस्थाओं है कि आपकी साइट को बनाने जैसे उपयोगकर्ता, डाक, लेखा, दोस्त आदि) रहता है। यदि कोड को आपकी इकाइयों से संबंधित डेटा को सहेजने, अपडेट करने या सारांशित करने की आवश्यकता है, तो इसे यहां रखें। यह आपके दृश्यों और नियंत्रकों में फिर से प्रयोग योग्य होगा।

+2

'पतला' के लिए महान लिंक - एमवीसी का उत्कृष्ट विवरण। –

+2

लोग वसा मॉडल से दूर जाने शुरू कर रहे हैं। मुझे डेटा संरचना के रूप में मेरे मॉडल के बारे में सोचना पसंद है। फिर मैं कुछ रूबी ऑब्जेक्ट लिखता हूं जो व्यवहार को लागू करता है, इसे मॉडल के साथ शुरू करता है (यह मॉडल को डेटा के रूप में उसी तरह से व्यवहार करता है जैसे आप तारों के बाहर वस्तुओं में डेटा के रूप में तारों और सरणी का इलाज कर सकते हैं)। [यहां है] (http://arrrrcamp.be/videos/2011/corey-haines---fast-rails-tests/) इस तकनीक के उदाहरण के साथ एक अच्छा वीडियो। –

+0

@AdamDonahue मुझे यकीन नहीं है कि वसा कुछ भी अच्छी चीज के रूप में देखा जा सकता है। सेवाओं में से संबंधित जिम्मेदारियों की टन बेहतर है। – fatuhoku

2

खैर, यह एक तरह से क्या तर्क निपटने के लिए साथ ...

अक्सर, यह समझ में आता है अपने मॉडल में अधिक चीजों को पुश करने के लिए, नियंत्रक छोटे छोड़ने है पर निर्भर करता है। यह सुनिश्चित करता है कि यह तर्क आसानी से कहीं भी इस्तेमाल किया जा सकता है जहां आपको अपने मॉडल का प्रतिनिधित्व करने वाले डेटा तक पहुंचने की आवश्यकता है। दृश्यों में लगभग कोई तर्क नहीं होना चाहिए। तो वास्तव में, सामान्य रूप से, आपको इसे बनाने का प्रयास करना चाहिए ताकि आप स्वयं को दोहराएं।

इसके अलावा, Google का एक त्वरित हिस्सा कहां जाता है इसके कुछ और ठोस उदाहरण बताता है।

आदर्श: सत्यापन आवश्यकताओं, डेटा संबंध, विधियां बनाने, विधियों को अद्यतन करने, विधियों को नष्ट करने, विधियों को खोजने के लिए (ध्यान दें कि आपके पास न केवल इन विधियों के सामान्य संस्करण होना चाहिए, लेकिन यदि कुछ ऐसा है जो आप बहुत कुछ कर रहे हैं, जैसे अंतिम नाम से लाल बालों वाले लोगों को ढूंढना, तो आपको उस तर्क को निकालना चाहिए ताकि आपको जो करना है वह find_redH_by_name ("smith") या उस तरह कुछ है)

देखें: यह डेटा के स्वरूपण के बारे में सब कुछ होना चाहिए , डेटा की प्रसंस्करण नहीं।

नियंत्रक: यह वह जगह है जहां डेटा प्रोसेसिंग जाती है। इंटरनेट से: "नियंत्रक का उद्देश्य उपयोगकर्ता द्वारा अनुरोधित कार्रवाई का जवाब देना है, उपयोगकर्ता द्वारा सेट किए गए किसी भी पैरामीटर को लेना, डेटा को संसाधित करना, मॉडल के साथ बातचीत करना, और उसके बाद अनुरोधित डेटा को अंतिम रूप में, पास करना राय।"

उम्मीद है कि मदद करता है।

13

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

डोमेन संचालित डिजाइन में सेवाओं की एक अवधारणा है जो एक ऐसी जगह है जहां आप तर्क को चिपकते हैं, जिसके लिए कई प्रकार की वस्तुओं को ऑर्केस्ट्रेट करने की आवश्यकता होती है, जिसका आमतौर पर तर्क होता है जो स्वाभाविक रूप से मॉडल वर्ग पर नहीं होता है।

मैं आमतौर पर सेवा परत के बारे में सोचता हूं कि मेरे अनुप्रयोगों के एपीआई के रूप में। मेरी सेवाएं परत आमतौर पर मेरे द्वारा बनाए जा रहे एप्लिकेशन की आवश्यकताओं के लिए बहुत करीब से मानचित्र बनाती हैं, इस प्रकार सेवा परत मेरे ऐप के निचले स्तरों में पाए जाने वाले अधिक जटिल इंटरैक्शन के सरलीकरण के रूप में कार्य करती है, यानी आप सेवा परतों को छोड़कर एक ही लक्ष्य पूरा कर सकते हैं लेकिन आपको इसे काम करने के लिए बहुत अधिक लीवर खींचना होगा।

ध्यान दें कि मैं यहां रेल के बारे में बात नहीं कर रहा हूं, मैं एक सामान्य वास्तुकला शैली के बारे में बात कर रहा हूं जो आपकी विशेष समस्या को संबोधित करता है।

31

pauliephonic करने के जवाब देने के जोड़ने के लिए:

हेल्पर: कार्यों को देखने के लिए आसान बनाने बनाने के लिए। उदाहरण के लिए, यदि आप हमेशा अपनी कीमत प्रदर्शित करने के लिए विगेट्स की एक सूची पर फिर से चल रहे हैं, तो इसे एक सहायक में रखें (वास्तविक प्रदर्शन के लिए आंशिक के साथ)। या यदि आपके पास आरजेएस का एक टुकड़ा है कि आप दृश्य को अपनाना नहीं चाहते हैं, तो इसे एक सहायक में रखें।

+0

वास्तव में हम हेल्पर में साइन_इन विधि भी नहीं डालते हैं? आरओआर ट्यूटोरियल के रूप में यहां सुझाव दिया गया है >>> http://ruby.railstutorial.org/book/ruby-on-rails-tutorial#sec-a_working_sign_in_method –

7

नियंत्रक में प्राधिकरण/अभिगम नियंत्रण से संबंधित सामान रखा है।

मॉडल आपके डेटा के बारे में हैं। मान्यता, रिश्ते, CRUD, व्यापार तर्क

दृश्य आपके डेटा दिखाने के बारे में हैं। केवल इनपुट प्रदर्शित करें और प्राप्त करें।

नियंत्रकों को नियंत्रित किए जाने वाले डेटा अपने मॉडल से अपने दृश्य (और जो दृश्य) और आपके विचार से अपने मॉडल के लिए को जाता है के बारे में कर रहे हैं। नियंत्रक मॉडल के बिना भी मौजूद हो सकते हैं।

मैं एक सुरक्षा गार्ड/रिसेप्शनिस्ट जो आप ग्राहक उचित काउंटर जहाँ आप एक टेलर (देखें) एक सवाल पूछने की (अनुरोध) का निर्देशन के रूप में नियंत्रक के बारे में सोचना अच्छा लगता है। टेलर (व्यू) तब जाता है और एक प्रबंधक (मॉडल) से जवाब प्राप्त करता है, जिसे आप कभी नहीं देखते हैं। आप अनुरोध तब सुरक्षा गार्ड/रिसेप्शनिस्ट (नियंत्रक) पर वापस जाएं और प्रतीक्षा करें जब तक कि आपको एक और टेलर (देखें) जाने का निर्देश नहीं दिया जाता है, जो आपको बताता है कि प्रबंधक (मॉडल) ने अन्य टेलर (देखें) प्रश्न के जवाब में उन्हें बताया ।

इसी तरह अगर आप टेलर (देखें) कुछ तो बताना चाहता हूँ मोटे तौर पर एक ही बात दूसरी टेलर आपको बता देंगे प्रबंधक अपनी जानकारी को स्वीकार कर लिया है कि क्या छोड़कर होता है। यह भी संभव है कि सुरक्षा गार्ड/रिसेप्शनिस्ट (नियंत्रक) ने आपको वृद्धि करने के लिए कहा हो क्योंकि आप उस प्रबंधक को जानकारी बताने के लिए अधिकृत नहीं थे।

तो रूपरेखा को विस्तारित करने के लिए, मेरी रूढ़िवादी और अवास्तविक दुनिया में, टेलर (विचार) सुंदर लेकिन खाली सिरदर्द हैं और अक्सर आप जो कुछ भी कहते हैं उस पर विश्वास करते हैं, सुरक्षा गार्ड/रिसेप्शनिस्ट कम से कम विनम्र हैं लेकिन वे बहुत ही ज्ञानी नहीं हैं लेकिन वे जानते हैं जहां लोगों को जाना चाहिए और नहीं जाना चाहिए और प्रबंधकों वास्तव में बदसूरत और मतलब हैं लेकिन सबकुछ जानते हैं और बता सकते हैं कि क्या सच है और क्या नहीं है।

5

एक बात है जो ठीक से अलग मदद करता है से परहेज किया जाता है विरोधी पैटर्न "देखने के लिए नियंत्रक से स्थानीय चर पारित"।इसके बजाय इस की:

# app/controllers/foos_controller.rb: 
class FoosController < ApplicationController 

    helper_method :foo 

    def show 
    end 

    protected 

    def foo 
    @foo ||= Foo.find(...) 
    end 

end 

#app/views/foos/show.html.erb: 
... 
<%= foo.bar %> 
... 

इससे संशोधित करने के लिए क्या "@foo" में रखी जाने बनाता है और यह कैसे है:

# app/controllers/foos_controller.rb: 
class FoosController < ApplicationController 

    def show 
    @foo = Foo.find(...) 
    end 

end 

#app/views/foos/show.html.erb: 
... 
<%= @foo.bar %> 
... 

एक गेटर कि एक सहायक विधि के रूप में उपलब्ध है के लिए इसे ले जाने का प्रयास उपयोग किया गया। यह नियंत्रक के बीच अलगाव बढ़ाता है और उन्हें और अधिक जटिल बनाये बिना देखता है।

+0

उहम्म ... युक। क्या आप इसे करने के लिए कृपया कुछ अच्छे कारण/परिदृश्य जोड़ सकते हैं। यह KISS और YAGNI को तोड़ता है और बहुत ही सुगंधित है (बस एक और cliche में टॉस करने के लिए) – Sixty4Bit

+2

1) रेल आपके दृश्य उदाहरण में नियंत्रक के आवृत्ति चर की प्रतिलिपि बनाने के लिए बहुत सारे जादू करता है। 2) सुझाए गए कार्यान्वयन को केवल तभी लोड किया जाता है जब इसे एक्सेस किया जाता है, जो कुछ समय में कुछ काम बचा सकता है। महत्वपूर्ण जवाब वास्तव में 1 है), हालांकि। – webmat

+11

* श्वास * यह भयानक है। रेल उदाहरण आवृत्ति साझाकरण एक विशेषता है जो एंटी-पैटर्न नहीं है। यह एक सर्वव्यापी, कम मानसिक-ओवरहेड सिंटेक्टिक चीनी है जो शायद ही कभी वास्तविक दुनिया की समस्याओं का कारण बनती है।यदि आपको यह पसंद नहीं है, ठीक है, लेकिन इसके चारों ओर कोडिंग एक बारोक गैर-मानक संरचना के साथ चीजों को असीम रूप से खराब बनाता है। इस मामले में आप प्रभावी रूप से एक वैश्विक (प्रति नियंत्रक प्रति नियंत्रक) चर बना रहे हैं। नाटकीय रूप से दायरे को बढ़ाकर परिवर्तनीय स्कोपिंग के कथित दुरुपयोग को सही करने का प्रयास बेहद विडंबनापूर्ण है। – gtd

-1

परीक्षण, परीक्षण ... मॉडल में जितना संभव हो उतना तर्क दें और फिर आप इसे ठीक से जांच सकेंगे। यूनिट परीक्षण डेटा का परीक्षण करके और जिस तरह से इसे मॉडल का परीक्षण करके गठित किया जाता है, और कार्यात्मक परीक्षण नियंत्रकों का परीक्षण करके जिस तरह से इसे रूट किया जाता है या नियंत्रित किया जाता है, परीक्षण करता है, इसलिए यह तब तक होता है जब तक कि यह डेटा की अखंडता का परीक्षण नहीं कर लेता आदर्श।

जे

10

बिल्कुल सही यहाँ स्पष्टीकरण पहले से ही, निष्कर्ष और आसान के रूप में एक बहुत ही सरल वाक्य याद रखें:

हम स्मार्ट मॉडल, पतली नियंत्रकों, और बधिर विचार की जरूरत है।

http://c2.com/cgi/wiki?ModelViewController

0

सरल शब्दों में, आम तौर पर, मॉडल सभी तालिका (रों) से संबंधित कोड होगा, उनके सरल या जटिल रिश्ते, हेरफेर (उन्हें एसक्यूएल एकाधिक तालिकाओं को शामिल प्रश्नों के रूप में लगता है) व्यापार तर्क का उपयोग कर परिणामस्वरूप पहुंचने के लिए डेटा/चर के।

नियंत्रक में अनुरोध किए गए नौकरी के लिए प्रासंगिक मॉडल की ओर कोड/पॉइंटर्स होंगे।

विचार उपयोगकर्ता इनपुट/इंटरैक्शन स्वीकार करेगा और परिणामी प्रतिक्रिया प्रदर्शित करेगा।

इनमें से कोई भी बड़ा विचलन उस भाग पर अवांछित तनाव डाल देगा और समग्र आवेदन प्रदर्शन प्रभावित हो सकता है।

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