यदि स्ट्रिंग खाली है तो कुछ डिफ़ॉल्ट मान लौटाएं


93

अक्सर मुझे यह जांचने की आवश्यकता होती है कि क्या कुछ मूल्य रिक्त है और यह लिखें कि "कोई डेटा मौजूद नहीं है":

@user.address.blank? ? "We don't know user's address" : @user.address

और जब हमें लगभग 20-30 क्षेत्र मिल गए हैं, तो हमें इस तरह से संसाधित करने की आवश्यकता है कि यह बदसूरत हो जाए।

मैंने जो बनाया है वह orविधि के साथ स्ट्रिंग क्लास को बढ़ाया है

class String
  def or(what)
    self.strip.blank? ? what : self
  end
end

@user.address.or("We don't know user's address")

अब यह बेहतर दिख रहा है। लेकिन यह अभी भी कच्चा और खुरदरा है

मेरी समस्या को हल करना बेहतर होगा। हो सकता है कि ActiveSupport classहेल्पर मेथड या मिक्सिंस या किसी अन्य चीज का विस्तार या उपयोग करना बेहतर होगा । क्या माणिक विचार, आपका अनुभव और सर्वोत्तम अभ्यास मुझे बता सकते हैं।

जवाबों:


227

ActiveSupport presenceसभी ऑब्जेक्ट्स के लिए एक विधि जोड़ता है जो इसके रिसीवर को वापस करता है यदि present?(विपरीत blank?), और nilअन्यथा।

उदाहरण:

host = config[:host].presence || 'localhost'

2
यह अच्छा है। डिफ़ॉल्ट रेल की गतिविधियाँ पूर्ववर्ती हैं। Thanx!
20:00 पर fl00r

सबसे पहले इसकी पुष्टि की जाती है क्योंकि मेरे समाधान में मुझे स्ट्रिंग, फिक्सनम और नीलक्लास का कम से कम विस्तार करना चाहिए। और यहाँ मैं बिना कोड के स्पष्ट कोड का उपयोग कर सकता हूं
fl00r

12

Phrogz तरह मुझे PofMagicfingers टिप्पणी में विचार दिया, लेकिन ओवरराइडिंग के बारे में क्या | बजाय?

class String
  def |(what)
    self.strip.blank? ? what : self
  end
end

@user.address | "We don't know user's address"

2

चूंकि आप रूबी ऑन रेल्स में ऐसा कर रहे हैं, ऐसा लगता है कि आप एक मॉडल के साथ काम कर रहे हैं। यदि आप अपने ऐप में हर जगह एक उचित डिफ़ॉल्ट मान चाहते हैं , तो आप (उदाहरण के लिए) addressअपने Userमॉडल के लिए विधि को ओवरराइड कर सकते हैं ।

मैं इसके लिए अच्छा कोड प्रदान करने के लिए ActiveRecord को अच्छी तरह से नहीं जानता; सीक्वल में यह कुछ इस तरह होगा:

class User < Sequel::Model
  def address        
    if (val=self[:address]).empty?
      "We don't know user's address"
    else
      val
    end
  end
end

... लेकिन इसके ऊपर के उदाहरण के लिए ऐसा लगता है कि आप अपने मॉडल में व्यू लॉजिक को मिलाएंगे, जो कि एक अच्छा विचार नहीं है।


हां, मॉडल में डिफॉल्ट सेट करना बुरा विचार है :) मेरे रूप रोएंगे
fl00r

2

आपके या विधि के कुछ अवांछित दुष्प्रभाव हो सकते हैं, क्योंकि वैकल्पिक (डिफ़ॉल्ट) मान का हमेशा मूल्यांकन किया जाता है, भले ही स्ट्रिंग खाली न हो।

उदाहरण के लिए

@user.address.or User.make_a_long_and_painful_SQL_query_here

यदि पता खाली न हो तो भी अतिरिक्त काम करेगा। हो सकता है कि आप इसे अपडेट कर सकें (एक-लाइनर को भ्रमित करने के बारे में खेद, इसे कम रखने की कोशिश करना):

class String
  def or what = ""
    self.strip.empty? ? block_given? ? yield : what : self
  end
end

@user.address.or "We don't know user's address"
@user.address.or { User.make_a_long_and_painful_SQL_query_here }

अच्छी टिप्पणी। समझ गया। लेकिन सभी कोड क्यों निष्पादित किए जाएंगे? देखिए:a=2 ; a == 2 ? "ok" : @b = 3 ; @b; #=> nil
fl00r

2
यह मूल कॉल करते समय निष्पादित किया जाएगा, न कि टर्नरी ऑपरेटर के साथ। विधि कॉल पर सभी तर्कों का मूल्यांकन किया जाएगा।
टन्टू

2

स्ट्रिंग के बजाय ActiveRecord या व्यक्तिगत मॉडल का विस्तार करना बेहतर है।

आपके विचार में, आप अधिक स्पष्ट पैटर्न पसंद कर सकते हैं

@user.attr_or_default :address, "We don't know the user's address"

क्या यह Active Record का हिस्सा है? कोई संदर्भ नहीं मिला।
कबूतर 56

0

माणिक:

unless my_str.empty? then my_str else 'default' end

आतंक विरोधी:

unless my_str.blank? then my_str else 'default' end
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.