के साथ प्रयास करने की जगह मेरे अधिकांश अनुप्रयोगों में, मेरे पास current_user
विधि है। current_user.name
जैसे मामलों में अपवादों से बचने के लिए current_user
nil
है, रेल try
विधि प्रदान करता है। इसके साथ समस्या यह है कि मुझे try
का उपयोग करने की याद रखने की आवश्यकता है जहां current_user
nil
हो सकता है।रेल: नल ऑब्जेक्ट पैटर्न
मैं इस अतिरिक्त ओवरहेड को हटाने के लिए शून्य ऑब्जेक्ट पैटर्न का उपयोग करना चाहता हूं।
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
साथ रहने के लिए क्या है?
नहीं समझ सकता क्यों आप लॉग-इन उपयोगकर्ताओं और अनाम उपयोगकर्ताओं के बीच एक ही पृष्ठों को साझा करने लगते हैं। यह सही ढंग से विभाजित क्यों नहीं है? – apneadiving