2011-01-31 12 views
5

मेरे पास नियंत्रकों का एक समूह है जो इंडेक्स व्यू प्रस्तुत करता है। इसके परिणामस्वरूप मुझे बहुमत के अंत में render :index लिखना पड़ता है। यहाँ एक उदाहरणमैं इन सभी कॉल को प्रस्तुत करने के लिए कैसे कर सकता हूं: अनुक्रमणिका?

def index 
    @models = Model.find(:all) 
end 

def new_models 
    @models = Model.find_by_new(true) 

    render :index 
end 

def old_models 
    @models = Model.find_by_new(false) 

    render :index 
end 

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

मेरे पास इस तरह की बड़ी संख्या में नियंत्रक हैं इसलिए समाधान कई बार दोहराए गए कोड को हटा देगा।

यह ऐप अभी भी रेल 2.3 है, हालांकि, इसे अगले महीने या दो में रेल 3 में अपग्रेड कर दिया जाएगा। इसलिए जब मैं 2.3 पर काम करने वाली तकनीक पसंद करूंगा, तो रेल 3 केवल समाधानों की सराहना की जाएगी।

+3

बस एक ध्यान दें, जहाँ तक संभव हो अर्थ की connascence से बचने का प्रयास करें। (मैं सिर्फ * के * था उस शब्द का प्रयोग करें दिन, 'क्योंकि मैंने अभी कंसनेसेंस के बारे में सीखा **: डी **) http://scotland-on-rails.s3.amazonaws.com/1A03_JimWeirich-SOR.mp4 देखें अगर – Zabba

+0

दिलचस्पी है तो यह एक बहुत अच्छी बात थी। इसे साझा करने के लिए धन्यवाद। मेरा उदाहरण कोई भी कोड नहीं है जिसे मैंने वास्तव में लिखा है। उदाहरण के लिए मैं बस बिना यादृच्छिक कोड डाल रहा था। मुझे खुशी है कि मैंने ऐसा किया है, अन्यथा मैंने कभी भी कंसकेंस के बारे में नहीं सीखा होगा :-) –

उत्तर

4

यदि आप वास्तव में इस क्रिया को अपनाना चाहते हैं, और यदि यह बहुत आम है, तो आप अपने स्वयं के कुछ मेटा प्रोग्रामिंग कर सकते हैं। सबसे पहले इस मॉड्यूल परिभाषा के साथ एक render_with_index.rb फ़ाइल बनाने:

 
module RenderWithIndex 
    def self.included klass 
    klass.class_eval do 
     def self.render_with_index * methods 
     methods.each do |method| 
      self.class_eval <<-EVAL 
      alias :old_method :#{method} 

      def #{method} 
       old_method 
       render :index 
      end 
      EVAL 
     end 
     end 
    end 
    end 
end 

तब और अपने नियंत्रक में कि मॉड्यूल शामिल तरीकों कि सूचकांक के साथ प्रस्तुत करना चाहिए परिभाषित करते हैं (यकीन है कि render_with_index कॉल अपने विधि घोषणाओं के बाद क्या होता बनाने

 
include RenderWithIndex 

def index 
    @models = Model.find(:all) 
end 

def new_models 
    @models = Model.find_by_new(true) 
end 

def old_models 
    @models = Model.find_by_new(false) 
end 

render_with_index :new_models, :old_models 

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

+0

+1 एक अलग दृष्टिकोण के लिए :) – hade

+0

उत्कृष्ट :-) बिल्कुल वही जो मैं खोज रहा था। –

2

मुझे बहुत शुष्क लगता है। IMHO यह उल्लेख करने के लिए एक अच्छा खरगोश है कि आप कौन से टेम्पलेट को प्रतिपादित कर रहे हैं यदि आप नियंत्रक विधि विशिष्ट टेम्पलेट का उपयोग नहीं करना चाहते हैं।

यदि आपका रेंडर कोड एक लाइनर से कोड की कई पंक्तियों में फैला हुआ है, तो मैं उन्हें अलग रेंडर विधि में डाल दूंगा।

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

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