सभी समय के लिए सभी रेल सहायक उपलब्ध क्यों हैं? क्या इसे अक्षम करने का कोई तरीका है?


89

मैं एक अलग नियंत्रक के लिए विचारों में एक नियंत्रक के लिए सहायक विधियों का उपयोग क्यों कर सकता हूं? क्या हैकिंग / पैचिंग के बिना इसे निष्क्रिय करने का एक तरीका है?


3
एक नया, अधिक प्रासंगिक उत्तर है। क्रेग वॉकर उत्तर की जाँच करें
EE33

जवाबों:


106

@ जॉर्ज शेइबर का तरीका रेल 3.1 के रूप में काम नहीं करता है; कोड काफी बदल गया है।

हालाँकि, रेल 3.1 में इस सुविधा को अक्षम करने का एक और बेहतर तरीका है (और बाद में उम्मीद है)। अपने config / application.rb में, यह पंक्ति जोड़ें:

config.action_controller.include_all_helpers = false

यह ApplicationController को सभी सहायकों को लोड करने से रोक देगा ।

(जो रुचि रखते हैं, उनके लिए यहां अनुरोध अनुरोध है जहां सुविधा बनाई गई थी ।)


मैं 3.2 पर हूं। क्या यहां application.config का मतलब config / application.rb है?
ब्रैंडन हेनरी

क्या ApplicationHelper को भी शामिल किया जाएगा यदि मैं शामिल___ppers को अक्षम करता हूं या मुझे इसे मैन्युअल रूप से शामिल करने की आवश्यकता है?
रॉबर्ट ऑडी

@AzizLight मुझे यकीन नहीं है, क्योंकि मैंने परीक्षण नहीं किया है। हालाँकि, मैं ऐसा उम्मीद करता हूं, क्योंकि ApplicationHelper का इरादा हमेशा "रूट" सहायक के रूप में विचारों में उपलब्ध होना चाहिए। यह असंबद्ध नियंत्रकों से मददगार है जो यहां प्राथमिक मुद्दे के हैं।
क्रेग वॉकर

3
मुझे लगता है कि यह डिफ़ॉल्ट व्यवहार होना चाहिए।
नाफा बोउटफर

98

उत्तर रेल संस्करण पर निर्भर करता है।

रेलें> = 3.1

उस include_all_helpersकॉन्फ़िगरेशन को falseकिसी भी वातावरण में बदलें जहाँ आप कॉन्फ़िगरेशन लागू करना चाहते हैं। यदि आप चाहते हैं कि सभी वातावरणों पर लागू होने वाला विन्यास इसे बदल दें application.rb

config.action_controller.include_all_helpers = false

झूठे होने पर, यह समावेश को छोड़ देगा ।

रेल्स <3.1

निम्न पंक्ति को हटाएं ApplicationController

helper :all

इस तरह प्रत्येक नियंत्रक अपने स्वयं के सहायकों को लोड करेगा।


2
यह रेखा मेरे लिए रेल 3.2 में मौजूद नहीं है, इसलिए यह समाधान अब रेल के बाद के संस्करणों पर लागू नहीं होगा।
टायलर कोलियर

@TylerCollier ने क्या कहा!
EE33

मुझे दिलचस्पी होगी कि क्यों यह संस्करण 3.1 से रेल से काफी बदल गया? मेरे लिए बहुत मायने नहीं रखता है।
जोशुआ मुहीम

6
नोट: उपरोक्त टिप्पणियां अब मान्य नहीं हैं, अब जब कि उत्तर रेल को शामिल करने के लिए अद्यतन किया गया है> 3.1
काइल हिरोनिमस

3
नोट: आपका ApplicationHelper अभी भी लोड किया जाएगा। यदि आप हर समय किसी विशिष्ट सहायक को शामिल करना चाहते हैं, तो आप include HelperNameअपने ApplicationHelper के शीर्ष पर जोड़ सकते हैं ।
वसं

27

रेल 3 में, actioncontroller/base.rb(लाइन 224 के आसपास):

def self.inherited(klass)
  super
  klass.helper :all if klass.superclass == ActionController::Base
end

तो हां, यदि आप अपनी कक्षा से प्राप्त करते हैं, तो ActionController::Baseसभी सहायकों को शामिल किया जाएगा।

इसके आसपास आने के लिए, अपने नियंत्रक कोड की शुरुआत में clear_helpers( AbstractClass::Helpers; शामिल किया गया ActionController::Base) कॉल करें । Clear_helpers के लिए स्रोत कोड टिप्पणी:

# Clears up all existing helpers in this class, only keeping the helper
# with the same name as this class.

उदाहरण के लिए:

class ApplicationController < ActionController::Base
  clear_helpers
  ...
end

10
जब तक आप कॉल clear_helpersकरते हैं (प्रदर्शन) क्षति पहले से ही हो चुकी है क्योंकि सभी सहायकों को लोड किया गया है। आप वास्तव में उपयोग करना चाहते हैं config.action_controller.include_all_helpers = false(जैसा कि @ क्रैग वाकर स्टेट्स, ऊपर), क्योंकि यह मदद करने वालों को पहली बार में लोड होने से रोकता है, इस प्रकार आपको कुछ प्रदर्शन प्राप्त करना (शायद विकास मोड में सबसे महत्वपूर्ण रूप से)। actioncontroller/base.rbस्निपेट को शामिल करने के लिए धन्यवाद ; कोड को देखना और रहस्य को दूर करना हमेशा अच्छा होता है।
जॉर्ज एंडरसन

clear_helpersअभी भी रेल के लिए उपयोगी है 3.0 - config.action_controller.include_all_helpers = falseकेवल रेल है 3.1 और इसके बाद के संस्करण।
16

5

वास्तव में रेल 2 में , ActionController :: Base की डिफ़ॉल्ट कार्यक्षमता सभी सहायकों को शामिल करने के लिए थी।

Chanhet 6222 on 02/24/07 20:33:47 (3 साल पहले) dhh द्वारा : इसे एक डिफ़ॉल्ट धारणा बना लें कि आप सभी सहायकों को हर समय चाहते हैं (हाँ, हाँ)

परिवर्तन:

class ApplicationController < ActionController::Base 
  helper :all # include all helpers, all the time 
end 

रेल 3 बीटा 1 के रूप में, अब ऐसा नहीं है जैसा कि CHANGELOG में नोट किया गया है:

  • जोड़ा गया कि ActionController :: बेस अब हेल्पर करता है: सभी रेल में डिफ़ॉल्ट ApplicationController पर भरोसा करने के बजाय इसे करते हैं [DHH]

1
तो क्या इसका मतलब है कि रेल 3 में, सभी हेल्पर्स डिफ़ॉल्ट रूप से लोड किए गए हैं?
निक सो

@ निश्चित रूप से हाँ, 3.2 के लिए कम से कम
नितिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.