2010-09-04 18 views
20

मैं कोडनिष्पादन से रेल नियंत्रक को कैसे रोकें?

def show 
    unless logged_in? 
     login_required 
     return 
    end 
    #some additional code 
    #that should only execute 
    #if user is logged in 
end 

का निम्न भाग इस पूरी तरह से काम करता है। अब मैं लॉगिन फ़िल्टर को पहले फ़िल्टर में ले जाना चाहता हूं। समस्या यह है कि जब मैं शो के बाहर किसी विधि से वापस आ जाता हूं, तो यह शो के निष्पादन को रोकता नहीं है ... मैं बाहरी विधि से कोड के माध्यम से show को कैसे रोकूं (यानी जिसे एक कहा जा सकता है पहले फ़िल्टर से)?

धन्यवाद!

उत्तर

16

यदि आप पहले_फिल्टर से झूठी वापसी करते हैं, तो अनुरोध का निष्पादन तुरंत बंद हो जाएगा।

यदि आप अपनी लॉगिन_रेक्वार्ड विधि को लॉग इन नहीं करते हैं तो झूठी (या रीडायरेक्ट) वापस लौटते हैं, और अगर वे हैं तो इसे वापस कर दें, तो बस before_filter :login_required, इसे पूरी तरह से काम करना चाहिए।

संपादित करें: Lenry नीचे में कहा गया है के रूप में, इस रेल में काम नहीं करेगा 2.0.1+ इसके बजाय, अपने कोड

+0

पूरी तरह से काम किया। धन्यवाद! –

+0

यह अब मान्य नहीं है। नीचे लेनी से जवाब की जांच करें। – tdgs

17

में अनुरोध उपयोग head :ok को रोकने के लिए संस्करणों 2.0.1 रेल और ऊपर, आप रीडायरेक्ट करना होगा या कार्रवाई के निष्पादन को रोकने के लिए एक प्रतिक्रिया भेजें।

Agile Web Development with Rails Errata से:

# 45840: निम्नलिखित गलत है:।

"एक से पहले फिल्टर रिटर्न झूठी, फिल्टर श्रृंखला समाप्त के प्रसंस्करण, और अगर कार्रवाई नहीं चलाया जाता है एक फिल्टर कर सकते हैं आउटपुट या रीडायरेक्ट अनुरोध भी प्रस्तुत करें, इस मामले में मूल कार्रवाई कभी नहीं आती है। "

एक पहले_फिल्टर अब फ़िल्टर झूठी पर फ़िल्टर श्रृंखला को संसाधित करना बंद नहीं करता है।

रेल 2.0.1 के रिलीज नोट्स से: * स्वचालित रूप से पर हो प्रस्तुत करना या पुनर्निर्देशित करने के लिए रोकने before_filter बदल दिया है, लेकिन अब पर पूरी तरह गलत [डेविड हाइनेमेयर हांससन]

--Rob क्रिस्टी

लौटने

redirect_to, render, और head सभी निष्पादन रोक देंगे। उदाहरण के लिए, head :ok केवल ठीक HTTP प्रतिक्रिया कोड के साथ अनुरोध का जवाब देगा, और कार्रवाई निष्पादित नहीं होगी।

+6

जब तक 'रेंडर' कॉल फ़िल्टर श्रृंखला के अंदर न हो, तब तक 'रेंडर' * के लिए कॉल * नियंत्रक कार्रवाई के निष्पादन को रोक नहीं पाएगा। (http://guides.rubyonrails.org/layouts_and_rendering.html#avoiding-double-render-errors) – pje

+3

अगर रोकों को निष्पादित करना है, तो आप दो बार प्रस्तुत करते समय डबल रेंडर त्रुटि क्यों प्राप्त करते हैं? – Mohamad

+4

यहां महत्वपूर्ण अंतर यह है कि निष्पादन को रोकने के लिए उन 3 विधियों को 'pre_filter' से बुलाया जाना चाहिए। – maletor

1

रेल 5 में कॉलबैक श्रृंखला रोकने के लिए आप उपयोग कर सकते

throw :abort 
+3

मुझे समझ में नहीं आता कि यह सबसे अच्छा स्थान कहां है, इस फेंकने वाले प्रतीक को पकड़ने के लिए।अगर मैं सभी नियंत्रकों के लिए कुछ तर्क सामान्य करना चाहता हूं, जो आगे की प्रसंस्करण को रोकता है, और मैं 'एप्लिकेशन कंट्रोलर' में 'abort' फेंक देता हूं, तो मैं इसे कहां पकड़ूं? – sameers

+0

thow: abort केवल मॉडल सत्यापन के लिए है और नियंत्रक नहीं है। – bkunzi01

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