2013-04-18 7 views
5

के साथ प्रयास करने की जगह मेरे अधिकांश अनुप्रयोगों में, मेरे पास current_user विधि है। current_user.name जैसे मामलों में अपवादों से बचने के लिए current_usernil है, रेल try विधि प्रदान करता है। इसके साथ समस्या यह है कि मुझे try का उपयोग करने की याद रखने की आवश्यकता है जहां current_usernil हो सकता है।रेल: नल ऑब्जेक्ट पैटर्न

मैं इस अतिरिक्त ओवरहेड को हटाने के लिए शून्य ऑब्जेक्ट पैटर्न का उपयोग करना चाहता हूं।

class NullUser 
    def method_missing(method_name, *args) 
    nil 
    end 
end 

def current_user 
    return NullUser.new unless UserSession.find 
    @current_user ||= UserSession.find.user 
end 

कुछ मामलों में यह try की जगह ले सकता:

current_user.try(:first_name)  #=> nil 
current_user.first_name   #=> nil 

लेकिन आगे श्रृंखलन के साथ विफल:

class NullUser 
    def method_missing(method_name, *args) 
    self.class.new 
    end 
end 

current_user.try { |u| u.profiles.first.name } #=> nil 
current_user.profiles.first.name    #=> nil 
:

current_user.profiles.first.name #=> undefined method... 

मैं अशक्त वस्तु वापसी करने की कोशिश की

लेकिन यह अन्य मामलों में विफल हो जाएगा:

current_user.is_admin?   #=> #<NullUser:0x96f4e98> 

इस समस्या का एक संभव समाधान है या हम सब try साथ रहने के लिए क्या है?

+1

नहीं समझ सकता क्यों आप लॉग-इन उपयोगकर्ताओं और अनाम उपयोगकर्ताओं के बीच एक ही पृष्ठों को साझा करने लगते हैं। यह सही ढंग से विभाजित क्यों नहीं है? – apneadiving

उत्तर

7

मैं NullUser के साथ चिपकेगा लेकिन चीजों को स्पष्ट करने के लिए इसका नाम बदलकर GuestUser पर बदल जाएगा। इसके अतिरिक्त आपको अपनी उपयोगकर्ता कक्षा से सभी महत्वपूर्ण विधि को रोकना चाहिए, उदा।

class GuestUser 
    def method_missing(method_name, *args) 
    nil 
    end 

    def is_admin? 
    false 
    end 

    # maybe even fields: 
    def name 
    "Guest" 
    end 

    # ... 
end 
2

आप अपने NullUser उदाहरण पर श्रृंखला के तरीकों के लिए सक्षम होना चाहते हैं, आप method_missing वापसी nil के बजाय self की आवश्यकता है। आप लौटने self.class.new करीब था के साथ प्रयास ...

Avdi Grim explains how to implement a Null Object pattern in Ruby.

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