2008-09-24 17 views
77

मेरे पास कुछ नियंत्रक विधियां हैं जिन्हें मैं साझा करना चाहता हूं। रेल पर रूबी में ऐसा करने का सबसे अच्छा अभ्यास क्या है? क्या मुझे एक अमूर्त वर्ग बनाना चाहिए जो मेरे नियंत्रक विस्तारित करते हैं, या मुझे मॉड्यूल बनाना चाहिए और इसे प्रत्येक नियंत्रक में जोड़ना चाहिए? नीचे नियंत्रक विधियां हैं जिन्हें मैं साझा करना चाहता हूं:रेल पर रूबी में नियंत्रकों के बीच कोड का पुन: उपयोग करने के लिए सर्वोत्तम अभ्यास

def driving_directions 
    @address_to = params[:address_to] 
    @address_from = params[:address_from] 
    @map_center = params[:map_center_start] 

    # if we were not given a center point to start our map on 
    # let's create one. 
    if [email protected]_center && @address_to 
    @map_center = GeoKit::Geocoders::MultiGeocoder.geocode(@address_to).ll 
    elsif [email protected]_center && @address_from 
    @map_center = GeoKit::Geocoders::MultiGeocoder.geocode(@address_from).ll 
    end 
end 

def printer_friendly 
    starting_point = params[:starting_point].split(',').collect{|e|e.to_f} 
    ne = params[:ne].split(',').collect{|e|e.to_f} 
    sw = params[:sw].split(',').collect{|e|e.to_f} 
    size = params[:size].split(',').collect{|e|e.to_f} 
    address = params[:address] 

    @markers = retrieve_points(ne,sw,size,false) 
    @map = initialize_map([[sw[0],sw[1]],[ne[0],ne[1]]],[starting_point[0],starting_point[1]],false,@markers,true) 
    @address_string = address 
end 
+1

क्या इस मामले में application.rb का उपयोग न करने का कोई विशेष कारण है? –

+4

केवल कुछ नियंत्रक कोड का उपयोग करेंगे, लेकिन सभी नहीं। –

उत्तर

110

मेरी राय में, सामान्य OO डिजाइन सिद्धांतों को लागू:

  • तो कोड वास्तव में उपयोगिताओं कि राज्य वस्तु का उपयोग करने की जरूरत नहीं है का एक सेट है, मैं एक मॉड्यूल में डालने पर विचार करेंगे के नाम से जाना अलग से। उदाहरण के लिए, यदि कोड सभी मैपिंग यूटिलिटीज है, तो मॉड्यूल Maps बनाएं, और Maps::driving_directions जैसी विधियों तक पहुंचें।
  • यदि कोड को राज्य की आवश्यकता है और इसका उपयोग किया जाता है या प्रत्येक नियंत्रक में उपयोग किया जा सकता है, तो कोड को एप्लिकेशन नियंत्रक में रखें।
  • यदि कोड को राज्य की आवश्यकता है और सभी नियंत्रकों के सबसेट में उपयोग किया जाता है जो निकट और तर्कसंगत रूप से संबंधित हैं (यानी मानचित्र के बारे में सभी) तो बेस श्रेणी (class MapController < ApplicationController) बनाएं और साझा कोड वहां रखें।
  • यदि कोड को राज्य की आवश्यकता है और सभी नियंत्रकों के सबसेट में उपयोग किया जाता है जो बहुत करीबी से संबंधित नहीं हैं, तो इसे मॉड्यूल में रखें और इसे आवश्यक नियंत्रकों में शामिल करें।

आपके मामले में, तरीकों राज्य (params) की जरूरत है, ताकि चुनाव नियंत्रकों यह जरूरत है कि के बीच तार्किक संबंध पर निर्भर करता है। इसके अलावा:

इसके अलावा

:

  • उपयोग partials जब संभव दोहराया कोड और एक आम 'आंशिक' निर्देशिका में या तो जगह या एक विशिष्ट पथ के माध्यम से शामिल करने के लिए।
  • जब संभव हो (विधियों के लिए) एक यथार्थवादी दृष्टिकोण पर चिपके रहें और यदि आप स्वयं को बहुत से गैर-भरोसेमंद तरीकों का निर्माण करते हैं तो उन्हें अपने स्वयं के नियंत्रक को निकालने पर विचार करें।
15

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

एक बार जब आप मॉड्यूल बनाते हैं, तो आपको वांछित नियंत्रकों में शामिल करने के लिए शामिल कथन का उपयोग करना होगा।

http://www.rubyist.net/~slagell/ruby/modules.html

1

मैं मॉड्यूल दृष्टिकोण के साथ सहमत हैं। अपनी lib निर्देशिका में एक अलग रूबी फ़ाइल बनाएं और मॉड्यूल को नई फ़ाइल में रखें।

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

0

एक और संभावना:

अपने सामान्य कोड राज्य की जरूरत है और आप नियंत्रकों के बीच व्यवहार साझा करना चाहते हैं, तो आप इसे या तो अपने model या lib निर्देशिका में सादे पुराने गहरे लाल रंग का कक्षा में डाल सकता है। याद रखें कि model कक्षाओं को लगातार नहीं होना चाहिए, भले ही सभी ActiveRecord कक्षाएं लगातार हों। दूसरे शब्दों में, यह model कक्षाओं के क्षणिक होने के लिए स्वीकार्य है।

1

यदि आप नियंत्रक और हेल्पर्स के बीच कोड साझा करना चाहते हैं, तो आपको लाइब्रेरी में मॉड्यूल बनाने का प्रयास करना चाहिए। आप कंट्रोलर और सहायक में विधि तक पहुंचने के लिए @ टेम्पलेट और @ कंट्रोलर का भी उपयोग कर सकते हैं। अधिक जानकारी के लिए यह जांचें http://www.shanison.com/?p=305

29

मुझे पता है कि यह सवाल 6 साल पहले पूछा गया था। बस यह इंगित करना चाहते हैं कि रेल 4 में, अब नियंत्रक चिंताएं हैं जो बॉक्स समाधान से अधिक हैं।

0

मैंने पाया कि नियंत्रकों में समान कोड साझा करने का एक प्रभावी तरीका है एक नियंत्रक दूसरे (जहां कोड रहता है) से प्राप्त होता है। मैंने नाम नियंत्रक नियंत्रकों के एक और सेट के साथ अपने नियंत्रकों में परिभाषित समान तरीकों को साझा करने के लिए इस दृष्टिकोण का उपयोग किया।

+1

कोड साझा करने के लिए विरासत का उपयोग कोड गंध के रूप में माना जाता है। आपको इससे बचना चाहिए। Http://programmers.stackexchange.com/a/12446 देखें। इसके बजाए, मॉड्यूल, चिंताओं या यहां तक ​​कि [सेवाएं ऑब्जेक्ट] का उपयोग करें (https://netguru.co/blog/service-objects-in-rails-will-help)। – Mio

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

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