2009-07-13 18 views
6

मैं एक नियंत्रक में पहले_फिल्टर को परिभाषित करना चाहता हूं, लेकिन हमेशा इसे अंतिम रूप से निष्पादित करता हूं।क्या पहले_फिल्टर को हमेशा अंतिम निष्पादित करने के लिए मजबूर करने का कोई तरीका है?

मुझे append_before_filter के बारे में पता है, लेकिन मैं इस फ़िल्टर को मॉड्यूल में निर्दिष्ट करना चाहता हूं, जहां अन्य कक्षाएं बाद में अन्य_फिल्टर भी जोड़ सकती हैं।

क्या ऐसा करने का कोई तरीका है?

उत्तर

2

मुझे यह हासिल करने के लिए एक शानदार तरीका से अवगत नहीं है। हालांकि, थोड़ी सी पार्श्व सोच का उपयोग करके ... आप यह सुनिश्चित कर सकते हैं कि आपके सभी नियंत्रक prepend_before_filter का उपयोग करें। इस तरह, यदि आपका मॉड्यूल before_filter का उपयोग करता है तो आपको पता चलेगा कि यह हमेशा अंतिम फ़िल्टर होगा क्योंकि नियंत्रक फ़िल्टर फ़िल्टर की शुरुआत में हमेशा अपने फ़िल्टर जोड़ रहे होंगे।

1

रेल एपीआई के अनुसार, डिफ़ॉल्ट "first_filter" "append_before_filter" के लिए उपनाम है, जो फ़िल्टर_चैन सूची के अंत में फ़िल्टर जोड़ता है। मैं कहूंगा कि एक उचित धारणा है कि यदि आप अपने फ़िल्टर को नियंत्रक में सही तरीके से ऑर्डर करते हैं तो उन्हें सूचीबद्ध किया जाएगा ताकि वे सूचीबद्ध हों। जैसा कि पिछले उत्तर से पता चलता है कि एक "prepend_before_filter" भी है जो सुनिश्चित करता है कि जो फ़िल्टर आप जोड़ रहे हैं वह filter_chain के सामने है।

2

आप अपने मॉड्यूल में before_filter ओवरराइड कर सकते हैं, या self.included कॉलबैक हुक alias_method_chain :before_filter, :final_filter घोषित कर सकते हैं। कोड के लिए यह अनुशंसित नहीं है कि आप रेल के कई संस्करणों में बंदरगाह करने में सक्षम होना चाहते हैं, या जब आप अन्य संदर्भों में उपयोग करने के लिए कोड जारी करेंगे।

3

यहां एक साधारण मॉड्यूल है जो पहले_फिल्टर के पूर्ण सेट के बाद मनमानी कोड निष्पादित करने की अनुमति देता है। थोड़े से काम के साथ, आप शायद इसे साफ़ कर सकते हैं ताकि विशेष after_before_filters की कतार यहां निष्पादित की जा सके (अपर्याप्त रोकथाम व्यवहार के साथ, और इसी तरह)।

module OneLastFilterModule 

    def self.included(base) 
    base.class_eval do 

     def perform_action_without_filters_with_one_last_filter 

     # 
     # do "final" before_filter work here 
     # 

     perform_action_without_filters_without_one_last_filter 
     end 
     alias_method_chain :perform_action_without_filters, :one_last_filter 

    end 
    end 

end 

ध्यान दें कि यदि आप इस करने के बारे में सावधान रहना चाहिए नियंत्रकों के बाद से खुद को फिल्टर घोषणा आदेश के आधार पर आदेश देने के बारे में मान्यताओं कर सकते हैं।

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

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