2009-05-04 15 views
44

मेरे पास कई क्रियाओं वाला नियंत्रक है जो: वर्ष और: यूआरएल से गुणों के रूप में। मैंने पर एक निजी विधि check_date बनाई है, दिनांक वैध है और जांचें कि तिथि भविष्य में नहीं है।redirect_to का उपयोग करने के बाद मैं नियंत्रक निष्पादन को कैसे रोकूं? (रेल का उपयोग)

def check_date(year, month) 
    if month < 1 || month > 12 || year < 2000 
    flash[:notice] = I18n.t 'archive.invalid_date' 
    redirect_to :action => 'index' 
    elsif year > Date.today.year || (year == Date.today.year && month > Date.today.month) 
    flash[:notice] = I18n.t 'archive.no_future' 
    redirect_to :action => 'month_index', 
     :year => Date.today.year, 
     :month => Date.today.month, 
     :type => params[:type] 
    end 
end 

वहाँ redirect_to के बाद नियंत्रक निष्पादन समाप्त होने के एक रेल रास्ता नहीं है?

तरीके मैं redirect_to के बाद एक अपवाद फेंक करने के लिए या check_date से कोई मान और प्रत्येक कार्य है कि यह कॉल में यह जांच करने के लिए या तो कर रहे हैं के बारे में सोच सकते हैं -

def month_index 
    year = params[:year].to_i 
    month = params[:month].to_i 
    if !check_date(year, month) 
    return 
    ... 
end 

की तरह कुछ लेकिन मुझे आश्चर्य है कि अगर वहाँ ऐसा करने के कुछ अच्छे रेल तरीके। मैं आधा था उम्मीद कर रहा था कि रेलवे को रीडायरेक्ट करने के लिए कहा जाएगा कि मैं स्टॉप चाहता हूं, लेकिन ऐसा प्रतीत नहीं होता है।

उत्तर

35

शायद आप फ़िल्टर का उपयोग करना चाहते हैं।

यदि आप नियंत्रक में को before_filter के रूप में कॉल करते हैं, तो तथ्य यह है कि यह प्रस्तुत या पुनर्निर्देशित किया गया है नियंत्रक को कभी भी क्रिया विधि को कॉल करने से रोक देगा। यह वहां और फिर समाप्त होता है।

+1

यह पूछताछ की समस्या को हल कर सकता है लेकिन मैं यहां vrish88 की तरह समाधान की उम्मीद कर रहा था। – iphone007

6

redirect_to केवल रेल को बताता है कि यह खत्म होने पर क्या प्रस्तुत करना है। अगर आप वास्तव में चाहते हैं तो निर्देशों के बाद अन्य रेंडर या रीडायरेक्ट_ निर्देशों को जोड़ते हैं तो रेल उलझन में आ जाएंगे, इसलिए रीडायरेक्ट_to के बाद नियंत्रक से वापस आएं - यह चीजों को करने के लिए 'सामान्य' रेल मार्ग है।

16

आप

return false 

भी आप चाहते हैं में फेंक कर सकते हैं अपनी कार्रवाई में कोड निष्पादन

+4

असल में, सिर्फ एक वापसी होगी। – kch

+3

हाँ, लेकिन जब यह एक निजी समारोह में होता है तो मुझे रिटर्न वैल्यू की जांच करनी पड़ती है, इसलिए मैं एक और अधिक स्वचालित तरीका ढूंढ रहा था - जैसे पहले_फिल्टर –

+0

@ हैमिशडाउनर उस मामले में, मैं निश्चित रूप से निजी फ़ंक्शन को मूल रूप से एक फॉर्म में वापस कर दूंगा यह क्या कर रहा है, यानी एक प्रतीक अगर यह अन्य प्रतीकों को लौटाता है, तो 'झूठा' अगर यह सामान्य रूप से 'सत्य', एक 'शून्य' वापस लौटाएगा, तो यह सामान्य रूप से अन्य डेटा देता है, या यहां तक ​​कि एक बाहरी चर या अपवाद का एक रूप भी अगर यह सहायक के लिए सबसे अच्छा लगता है। फिर नियंत्रक को उठाया जाना चाहिए हालांकि निजी कार्य नकारात्मक स्थिति व्यक्त करता है, और उस पर प्रतिक्रिया करता है।कंट्रोलर विधि की कार्यक्षमता को एक निजी समारोह में मिलाकर न केवल गन्दा हो जाता है, यह पुन: प्रयोज्यता में बाधा डालता है। –

47

को रोकने के लिए आप भी कर सकते हैं:

return redirect_to :action => 'index' 

और

return redirect_to :action => 'month_index', 
    :year => Date.today.year, 
    :month => Date.today.month, 
    :type => params[:type] 

क्योंकि यह अच्छा वें दिखता है अपनी लाइन (आईएमएचओ) पर एक वापसी वापसी।

+0

या 'redirect_to: action => 'अनुक्रमणिका' और वापसी ' – Rigo

0

मुझे लगता है कि ओपी redirect_to के कार्य के बारे में उलझन में है।

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

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