2010-03-05 15 views
57

स्पष्टता के लिए नाम और वस्तुओं को सरल बनाया गया है। मूल अवधारणा वही बना है।रेल में पहले_फिल्टर छोड़ें

मेरे पास तीन नियंत्रक हैं: dog, cat, और horse। ये नियंत्रक सभी नियंत्रक animal से प्राप्त होते हैं। नियंत्रक animal में, मैं एक से पहले फिल्टर है कि इस तरह के रूप में एक उपयोगकर्ता प्रमाणित करता है:

before_filter :authenticate 

def authenticate 
    authenticate_or_request_with_http_basic do |name, password| 
    name == "foo" && password == "bar" 
    end 
end 

dog की show कार्रवाई में, मैं (प्रमाणीकरण को छोड़) सभी उपयोगकर्ताओं के लिए खुले उपयोग की आवश्यकता है।

मैं dog के लिए अलग से प्रमाणीकरण लिखने के लिए थे, तो मैं कुछ इस तरह कर सकता है:

before_filter :authenticate, :except => :show 

लेकिन चूंकि animal से dog इनहेरिट करती है, मैं नियंत्रक-विशिष्ट कार्यों के लिए उपयोग नहीं है। animal नियंत्रक में showdog की कार्रवाई न केवल cat और horse की कार्रवाई को प्रमाणीकरण छोड़ देगा। यह व्यवहार वांछित नहीं है।

animal से विरासत में रखते हुए की कार्रवाई show कार्रवाई के लिए केवल प्रमाणीकरण को कैसे छोड़ सकता हूं?

उत्तर

107
class Dog < Animal 
    skip_before_filter :authenticate, :only => :show 
end 

फिल्टर के बारे में अधिक जानकारी के लिए ActionController::Filters::ClassMethods देखें skip_before_filter

यह अपने उदाहरण में Rails API

में विस्तार से बताया है dog सिर्फ होगा और विरासत।

+2

'skip_before_filter' को बहिष्कृत किया गया प्रतीत होता है >> [http://apidock.com/rails/ActionController/Filters/ClassMethods/skip_before_filter#1083-deprecated-moved](http://apidock.com/rails/ActionController/ फ़िल्टर/क्लासमेड्स/skip_before_filter # 1083-बहिष्कृत-स्थानांतरित) वे 'skip_filter' का उपयोग करने की अनुशंसा करते हैं जो 'skip_before_filter',' skip_after_filter' और 'skip_around_filter' को सभी को एक साथ कॉल कर रहा है। – Bachet

+4

नहीं है .. वे सिर्फ विधि को किसी अन्य वर्ग में ले जाते हैं, http://apidock.com/rails/v3.2.3/AbstractController/Callbacks/ClassMethods/skip_before_filter – Orlando

+0

हाँ इसे –

3

इसके लिए आपको उपयोग कर सकते हैं शामिल करने के लिए

skip_before_filter :authenticate 
12

दिए गए दो उत्तर आधा अधिकार हैं।

class Dog < Animal 
    skip_before_filter :authenticate, :only => :show 
end 
2

बस एक छोटा सा अद्यतन कि रेल 4 का उपयोग, यह अब skip_before_action :authenticate, :only => :show और है: आदेश अपने सभी कुत्ते कार्यों खुला करने से बचने के लिए, आप केवल 'शो' कार्रवाई करने के लिए लागू करने के लिए इस प्रकार skip_before_filter अर्हता प्राप्त करने की आवश्यकता है कि पहले_फिल्टर को अब before_action का उपयोग करना चाहिए।

+0

स्थानांतरित किया गया है यह एक टिप्पणी होनी चाहिए। – dan

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