2014-04-09 5 views
49

मेरे पास मेरे उपयोगकर्ताओं के लिए एक शो पेज है और प्रत्येक विशेषता केवल उस पृष्ठ पर दिखाई देनी चाहिए, अगर यह शून्य नहीं है और खाली स्ट्रिंग नहीं है। नीचे मेरे पास नियंत्रक है और यह प्रत्येक चर के लिए कोड @user.city != nil && @user.city != "" कोड की एक ही पंक्ति लिखना काफी परेशान है। मैं अपनी खुद की विधियों को बनाने से बहुत परिचित नहीं हूं, लेकिन क्या मैं इस तरह कुछ करने के लिए शॉर्टकट बना सकता हूं: @city = check_attr(@user.city)? या क्या इस प्रक्रिया को कम करने का एक बेहतर तरीका है?रेल शॉर्टकट में शून्य नहीं है और खाली नहीं है?

users_controller.rb

def show 
    @city = @user.city != nil && @user.city != "" 
    @state = @user.state != nil && @user.state != "" 
    @bio = @user.bio != nil && @user.bio != "" 
    @contact = @user.contact != nil && @user.contact != "" 
    @twitter = @user.twitter != nil && @user.twitter != "" 
    @mail = @user.mail != nil && @user.mail != "" 
end 

उत्तर

139

एक विधि है कि आप के लिए यह करता है नहीं है। रिक्त तार, रिक्त स्थान या टैब से युक्त तारों को मौजूद नहीं माना जाता है।

के बाद से इस पैटर्न वहाँ ActiveRecord में भी एक शॉर्टकट इतना आम है:

def show 
    @city = @user.city? 
end 

यह मोटे तौर पर बराबर है।

एक नोट के रूप में, nil बनाम परीक्षण लगभग हमेशा अनावश्यक है। रुबी में केवल दो तर्कसंगत झूठे मूल्य हैं: nil और false। जब तक यह संभव है एक चर शाब्दिक false होने के लिए, यह पर्याप्त होगा:

if (variable) 
    # ... 
end 

यह सामान्य if (!variable.nil?) या if (variable != nil) सामान है कि कभी-कभी दिखाई देता है बेहतर है। रूबी एक और कमीशनवादी अभिव्यक्ति के प्रकार को वार्ड करता है।

एक कारण यह है कि आप बनाम nil की तुलना करना चाहते हैं तो आप एक त्रिकोणीय राज्य चर कि true, false या nil हो सकता है और आप पिछले दो राज्यों के बीच अंतर करने की जरूरत है।

+6

नोट, रुबी 2.3.0 के रूप में आप कई से छुटकारा पा सकते हैं लोनली ऑपरेटर का उपयोग करके अनावश्यक शून्य जांच, 'if @user &&@ user.authenticated' जैसी कुछ' बस @ उपयोगकर्ता और। प्रमाणीकृत 'हो सकती है –

8

आप .present? जो ActiveSupport के साथ शामिल आता है का उपयोग कर सकते हैं।

@city = @user.city.present? 
# etc ... 

आपको इस तरह की यह

def show 
    %w(city state bio contact twitter mail).each do |attr| 
    instance_variable_set "@#{attr}", @user[attr].present? 
    end 
end 

यह ध्यान देने योग्य है कि आप परीक्षण करना चाहते हैं, तो अगर कुछ खाली है, तो आप .blank? (उपयोग कर सकते हैं लायक है इस विपरीत है भी लिख सकता है .present?)

इसके अलावा, foo == nil का उपयोग न करें। इसके बजाय foo.nil? का उपयोग करें। नहीं- nil प्लस सामग्री है के लिए

def show 
    @city = @user.city.present? 
end 

present? विधि परीक्षण:

+0

क्या आप समझा सकते हैं कि पहली पंक्ति कैसे काम करेगी ..? –

+0

@ मयंक, ओपी एक आवृत्ति चर को 'true' /' false' मान पर सेट कर रहा है। 'reciever.present? 'अगर रिसीवर' एक खाली मूल्य है तो सत्य वापस आ जाएगा। कृपया आगे के स्पष्टीकरण के लिए जुड़े दस्तावेज़ देखें। – naomik

+0

धन्यवाद मुझे आपकी बात मिली लेकिन मैं समझ नहीं पा रहा हूं कि example_variable_set "@ # {attr}", @user [attr] .present? काम करेगा..? –

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