रूबी ऑन रेल्स में नियंत्रकों के बीच कोड के पुन: उपयोग के लिए सर्वोत्तम अभ्यास


82

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

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 !@map_center && @address_to
    @map_center = GeoKit::Geocoders::MultiGeocoder.geocode(@address_to).ll
  elsif !@map_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
केवल यह कि कुछ नियंत्रक कोड का उपयोग करेंगे, लेकिन सभी नहीं।
काइल बून

जवाबों:


113

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

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

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

इसके अलावा:

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

33

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


16

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

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

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


1

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

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


1

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


0

एक अन्य संभावना:

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


0

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


1
कोड साझा करने के लिए वंशानुक्रम का उपयोग करना कोड गंध माना जाता है। आपको इससे बचना चाहिए। प्रोग्रामर देखें ।stackexchange.com/a/12446 । इसके बजाय, मॉड्यूल, चिंताओं या यहां तक ​​कि सेवाओं की वस्तु का उपयोग करें
Mio
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.