2012-01-09 11 views
5

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

def categories 
    @categories = Category.all 
end 

में एक विधि लिखा था लेकिन मैं कैसे डिफ़ॉल्ट रूप से इस विधि सभी नियंत्रकों और कार्यों के लिए उपलब्ध कर सकते हैं ताकि मुझे नहीं विशेष रूप से हर क्रिया

def list 
    categories 
    @products = Product.order('title').page(params[:page]).per(4) 
end 
+0

application_controller में और बाद आवेदन नियंत्रक परिभाषा यह है कि विधि को परिभाषित 'जोड़ने helper_method: categories' (क्या आप' helper_method' कहा जाता है चाहता हूँ) – cristian

उत्तर

10

आप में इस विधि कॉल करनी होगी application_controller.rb में अपनी विधि को परिभाषित कर सकते हैं और चूंकि प्रत्येक अन्य नियंत्रक को इस से विरासत मिलती है, यह विधि सभी नियंत्रकों के लिए उपलब्ध होगी। इसके अलावा, इसे दृश्यों में उपलब्ध होने के लिए एक सहायक विधि बनाने के लिए, आप application_controller.rb में कह सकते हैं।

अब, नियंत्रक में किसी भी अन्य क्रिया से पहले स्वचालित रूप से मूल्यांकन किया जाना है, तो आप पहले_फिल्टर का उपयोग कर सकते हैं। before_filter :my_method नियंत्रक आप चाहते हैं इस विधि किसी भी कार्रवाई से पहले या application_controller.rb में मूल्यांकन किया जाना में जोड़े

0

आप कुछ है कि इस मामले में की तरह, पूरे आवेदन भर में हो गया है चाहते हैं: @categories , फिर एक सहायक लिखें।

app/helpers/application_helper.rb में

module ApplicationHelper 
    def get_all_categories 
    @categories = Category.all 
    end 
end 
-2

मैं न बात इस वैश्विक चलाने का एक तरीका होता है। आप इसे before_filter में चला सकते हैं, इसलिए इसे प्रत्येक क्रिया से पहले बुलाया जाता है लेकिन आपको इसे प्रत्येक नियंत्रक में फिर से निर्दिष्ट करना होगा!

<% Category.all.each do |category| %> 
    <% do stuff to display all categories %> 
<% end %> 

तो आप बस अपने layout/application.html.erb को render कॉल जोड़ सकता है कि यह आपके लिए क्या करना होगा:

मेरे सुझाव एक आंशिक श्रेणी में साइडबार सामान डालने के लिए जो इस तरह एक कॉल में शामिल होगा!

+1

'आप इसे एक before_filter में चला सकते हैं तो अपने प्रत्येक कार्य से पहले कहा जाता है लेकिन आपको इसे प्रत्येक नियंत्रक में फिर से निर्दिष्ट करना होगा ... यदि आप एप्लिकेशन नियंत्रक में 'first_filter' रखते हैं, तो आपको इसे प्रत्येक नियंत्रक कार्रवाई में फिर से निर्दिष्ट करने की आवश्यकता नहीं है (क्योंकि डिफ़ॉल्ट रूप से वे फ़िल्टर का उत्तराधिकारी होते हैं)। साथ ही, आप उन विचारों में मॉडल कॉल कर रहे हैं जो कभी भी अच्छी बात नहीं है। चार शब्द फेंकने पर आसान जाओ। – iwasrobbed

+0

दृश्य में 'सभी' कॉल करने में कोई समस्या नहीं है, मॉडल पर विधियों को कॉल करने के लिए ठीक है क्योंकि इसमें कोई तर्क नहीं है जो 'मॉडल' या 'नियंत्रक' से संबंधित है। – davidb

+0

मुझे लगता है कि ऐसा कुछ निश्चित रूप से एक सहायक में संभवतः दृश्य में है। मैं <% कैश ('sidebar_categories') जोड़ूंगा> इसके आसपास%> और साइडबार श्रेणी में अपडेट को अमान्य कर दूंगा। – sunkencity

0

शायद मणि कोशिकाओं का उपयोग करने का सबसे उचित तरीका है। निश्चित रूप से प्रयास करना चाहिए: http://cells.rubyforge.org/

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

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