13

मैं रेल 2.3.5 पर हूँ और मैं इस समस्या है: फिल्टर से पहले foo दो बार फोन किया जाता है:नियंत्रक को उप-वर्गीकृत होने पर रेल से पहले_फिल्टर को दो बार क्यों कहा जाता है?

class BaseController < ApplicationController 
    before_filter :foo, :only => [:index] 
end 

class ChildController < BaseController 
    before_filter :foo, :only => [:index, :show, :other, :actions] 
end 

समस्या यह है कि ChildController पर, है।

मैंने इस समस्या के आसपास कई कामकाज की कोशिश की है। अगर मुझे बच्चे में :index कार्रवाई शामिल नहीं है, तो उसे उस क्रिया के लिए कभी भी बुलाया नहीं जाता है।

समाधान मैं काम करता है पाया है, लेकिन मुझे लगता है कि यह बहुत बहुत बदसूरत है

skip_before_filter :foo 
before_filter :foo, :only => [:index, :show, :other, :actions] 

वहाँ इस समस्या को हल करने के लिए एक बेहतर तरीका है?

उत्तर

15

"यह व्यवहार डिज़ाइन द्वारा है"।

नियंत्रकों पर रेल गाइड राज्यों:

"। फिल्टर विरासत में मिला रहे हैं, अगर आप ApplicationController पर कोई फ़िल्टर सेट है, यह अपने आवेदन में हर नियंत्रक पर चलाया जाएगा ताकि"

यह आपके द्वारा देखे जा रहे व्यवहार को बताता है। यह आपके द्वारा प्रस्तावित सटीक समाधान का सुझाव देता है (skip_before_filter का उपयोग करके) यह निर्धारित करने के लिए कि कौन से फ़िल्टर किसी विशेष नियंत्रक और/या विधियों के लिए चलाए जाएंगे या नहीं।

तो, बदसूरत या नहीं, ऐसा लगता है कि आपके द्वारा पाया गया समाधान सामान्य और अनुमोदित अभ्यास है।

http://guides.rubyonrails.org/action_controller_overview.html#filters

3

आप skip_before_filter का उपयोग नहीं करना चाहते हैं, तो आप हमेशा ChildController में index कार्रवाई को छोड़ सकता है:

class ChildController < BaseController 
    before_filter :foo, :only => [:show, :other, :actions] 
end 

लेकिन अगर आप BaseController में व्यवहार को बदलने यह एक समस्या बन सकता है और फ़िल्टर को index क्रिया से हटा दें। फिर इसे कभी भी नहीं कहा जाएगा इसलिए skip_before_filter का उपयोग करना बेहतर विचार हो सकता है।

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