স্ট্রিং যদি খালি থাকে তবে কিছু ডিফল্ট মানটি ফিরিয়ে দিন


94

প্রায়শই আমাকে কিছু মান ফাঁকা আছে কিনা তা যাচাই করতে হবে এবং লিখতে হবে যে "ডেটা উপস্থিত নেই":

@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সাহায্যকারীর পদ্ধতি বা মিক্সিন বা অন্য যে কোনও কিছু প্রসারিত বা ব্যবহার করা ভাল । কি রুবি আদর্শ, আপনার অভিজ্ঞতা এবং সেরা অনুশীলন আমাকে বলতে পারেন।

উত্তর:


230

অ্যাক্টিভসপোর্ট presenceসকল বস্তুর সাথে একটি পদ্ধতি যুক্ত করে যা তার রিসিভারটি যদি present?(এর বিপরীতে থাকে blank?) প্রদান করে এবংnil অন্যথায় ।

উদাহরণ:

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

4
এটি দুর্দান্ত। ডিফল্ট রেলের সম্ভাব্যতাগুলি পূর্বনির্ধারিত হয়। থ্যাঙ্কস!
fl00r

প্রথমত এটি প্রিফার্ড করা হয় কারণ আমার সমাধানে আমার স্ট্রিং, ফিক্সনাম এবং নীলক্লাস কমপক্ষে প্রসারিত হওয়া উচিত। এবং এখানে আমি কেবল বাইকেল ছাড়াই পরিষ্কার কোড ব্যবহার করতে পারি
fl00r

12

পোফমেজিকফিংগারদের মন্তব্যে ফ্রোগজ আমাকে ধরণের ধারণা দিয়েছে, তবে ওভাররাইডিং সম্পর্কে কী? পরিবর্তে?

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

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

2

যেহেতু আপনি এটি রুবেল অন রেলসে করছেন, দেখে মনে হচ্ছে আপনি কোনও মডেল নিয়ে কাজ করছেন। আপনি যদি আপনার অ্যাপ্লিকেশানের যে কোনও জায়গায় যুক্তিসঙ্গত ডিফল্ট মান চান , তবে আপনি (উদাহরণস্বরূপ) addressআপনার Userমডেলের জন্য পদ্ধতিটিকে ওভাররাইড করতে পারেন ।

আমি এ্যাকটিভেকর্ডকে এটির জন্য ভাল কোড সরবরাহ করার জন্য ভালভাবে জানি না; সিকুয়েলে এটি এমন কিছু হবে:

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

4
মূল কল করার সময় এটি কার্যকর করা হবে, টার্নারি অপারেটরের সাথে নয়। সমস্ত আর্গুমেন্ট পদ্ধতি কল এ মূল্যায়ন করা হবে।
টন্ট্টু

1

স্ট্রিংয়ের পরিবর্তে অ্যাক্টিভেকর্ড বা স্বতন্ত্র মডেলগুলি প্রসারিত করা ভাল।

আপনার দৃষ্টিতে, আপনি আরও স্পষ্টভাবে পছন্দ মতো পছন্দ করতে পারেন

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

এটি কি সক্রিয় রেকর্ডের অংশ? কোনও রেফারেন্স পাইনি।
cabe56

0

রুবি:

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

আরআর:

unless my_str.blank? then my_str else 'default' end
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.