2012-01-11 19 views
11

मैं एक रेल ट्यूटोरियल में इस कोड को देखा है मैंरेल/रूबी "और झूठे वापसी" वाक्य रचना

def access_denied 
    redirect_to login_path, :notice => "Please log in to continue" and return false 
end 

कर रहा हूँ सीखने रेल से पहले, मैं गहरे लाल रंग का अनुसंधान और कोई भी पुस्तकें की एक बड़ी राशि से किया था मैंने इसे पढ़ा और "झूठी वापसी" वाक्यविन्यास यहां पर पढ़ा है। मुझे रेल सिंटैक्स में इसका कोई उल्लेख नहीं मिल रहा है, क्या कोई भी लिंक या कोई स्पष्टीकरण प्रदान करने में सक्षम है जो इसे साफ़ करेगा?

मुझे यहां "और" की आवश्यकता को समझ में नहीं आया क्योंकि मैंने सोचा था कि रूबी हमेशा अंतिम मूल्यांकन अभिव्यक्ति वापस कर देगी।

+0

ओह, मैंने सोचा था कि आप पूछ रहे थे * क्यों * इसका उपयोग किया जाएगा। किसी भी मामले में, यदि इसका उपयोग मेरे उत्तर में वर्णित फ़िल्टर द्वारा किया जा रहा है, तो बहुत सावधान रहें। –

उत्तर

21

और वहाँ आप वापसी झूठी पिछले बयान के रूप में एक ही पंक्ति में लिखने के लिए सक्षम होने के लिए केवल के लिए है।

यह ऐसा करने का बराबर है:

redirect_to login_path, :notice => "Please log in to continue" 
return false 

यह नहीं बिल्कुल वैसा ही है, क्योंकि के साथ "और" यह केवल झूठे वापसी होगी redirect_to विधि कुछ है कि शून्य या नहीं है लौटाता है यदि झूठी लेकिन जैसा कि यह लगभग हमेशा कुछ ऐसा देता है जो शून्य और न ही झूठा तब कथन का दाहिना तरफ हमेशा निष्पादित होता है (और झूठी वापस आ गया है)।

और रूबी में सिर्फ & & करने के लिए एक अन्य नाम है और केवल एक ही अंतर के साथ ऐसा बिल्कुल व्यवहार करती है, यह बयान के अन्य सभी टुकड़े की तुलना में कम पूर्वता है, तो पहले यह मूल्यांकन करता है जो कुछ भी है यह है पर बाएं और फिर लागू हो जाता है। रुबी में या भी है जो के समान है || लेकिन अभिव्यक्तियों में कम प्राथमिकता के साथ।

+1

यदि आप कभी भी ऐसी वापसी को जोड़ना चाहते हैं जो हमेशा निष्पादित करता है लेकिन आप ** ** विश्वास नहीं करते हैं कि पहली अभिव्यक्ति हमेशा गैर-झूठी वापसी करेगी, तो आप 'और' की बजाय अर्धविराम का भी उपयोग कर सकते हैं: 'do_something तर्क, तर्क; झूठी वापसी ' –

2

फ़िल्टर प्रकार के मूल्यों की अपेक्षा होने पर इस प्रकार का निर्माण फ़िल्टर के साथ उपयोग किया जाता था। false सामान्य अनुरोध प्रसंस्करण को रोक देगा।

तो एक नियंत्रक इस तरह दिख रही है, तो:

class FooController < ActionController::Base 
    before_filter :access_denied 
    # etc. 
end 

नियंत्रक की कार्रवाई चल पाएंगे में से कोई भी;

def check_access 
    return access_denied unless current_user.has_access 
end 

इन दिनों फिल्टर वापसी मान अनदेखा किया जाता है: इस विधि संभावना की तरह, से एक फिल्टर के नाम से जाना डिजाइन किया गया था।

इसे क्रिया को संसाधित करने और रीडायरेक्ट के बाद वापस आने के लिए एक क्रिया में सामान्य विधि के रूप में उपयोग किया जा सकता है, इसलिए कोई अन्य तर्क/प्रतिपादन/आदि नहीं है। नियंत्रक के अंदर चलाया जाता है।

3

redirect_to login_path, :notice => "Please log in to continue" रूबी में एक सामान्य अभिव्यक्ति है कि झूठी (या नहीं के बराबर, source code देखें) वापस नहीं करता है, तो प्रोग्राम निष्पादन जारी है (और बाद दूसरे भाग की जाँच करने के लिए) और return false क्रियान्वित किया जा सकता।ऑपरेटरों पर

1

प्रलेखन: Under the "Defined?, And, Or, and Not" section

and का उपयोग करते हुए एक साथ जब तक उनमें से एक रिटर्न nil या false संबंधित कार्यों के चेनिंग लिए उपयोगी है। आप इसका इस्तेमाल अपने प्रश्न में दिखाए गए जैसे कर सकते हैं या आप इसे कोड की लाइन शॉर्ट-सर्किट में भी इस्तेमाल कर सकते हैं।

# Short circuit example 
blog = Blog.find_by_id(id) and blog.publish! 

ब्लॉग केवल .publish! इस पर कहा जाता है, तो find_by_id सफल रहा था हो जाता है।

अपने उदाहरण में:

def access_denied 
    redirect_to login_path, :notice => "Please log in to continue" and return false 
end 

वे सिर्फ यह प्रयोग कर रहे हैं कोड एक लाइन के बारे में अधिक दृढ़तापूर्वक लिखने के लिए।

हालांकि, यह भी एक नियंत्रक कार्रवाई जहां सशर्त, के आधार पर रेंडरिंग किया जा सकता है के लिए उपयोगी है और आप रेल पाने के लिए नहीं करना चाहते हैं "कई renders" चेतावनी:

def show 
    if something 
    render :partial => 'some_partial' 
    end 

    render :partial => 'some_other_partial' 
end 

रेल आपको एक चेतावनी दे देंगे यदि something सत्य लौटाता है क्योंकि आपके पास कार्रवाई में एकाधिक रेंडर स्टेटमेंट का मूल्यांकन किया जा रहा है। हालांकि, अगर आपने इसे

if something 
    render :partial => 'some_partial' and return 
end 

में बदल दिया है तो यह आपको कार्रवाई निष्पादन को रोकने की अनुमति देगा।

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