หากสตริงว่างเปล่าให้ส่งคืนค่าเริ่มต้นบางค่า


94

บ่อยครั้งที่ฉันต้องตรวจสอบว่าค่าบางค่าว่างเปล่าและเขียนว่า "No data present" ดังนี้:

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

และเมื่อเรามีประมาณ 20-30 ช่องที่เราต้องประมวลผลแบบนี้มันจะน่าเกลียด

สิ่งที่ฉันทำคือขยายคลาส String ด้วย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หรือใช้วิธีตัวช่วยหรือส่วนผสมหรืออย่างอื่น อะไรคืออุดมคติของทับทิมประสบการณ์และแนวทางปฏิบัติที่ดีที่สุดของคุณสามารถบอกฉันได้

คำตอบ:


232

ActiveSupport เพิ่มpresenceวิธีการให้กับวัตถุทั้งหมดที่ส่งกลับตัวรับถ้าpresent?(ตรงกันข้ามกับblank?) และnilอื่น ๆ

ตัวอย่าง:

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

2
ที่นี่หนาว. กำหนดตำแหน่งรางเริ่มต้นไว้ล่วงหน้า Thanx!
fl00r

ประการแรกเป็น preffered เพราะในโซลูชันของฉันฉันควรขยาย String, Fixnum และ NilClass เป็นอย่างน้อย และที่นี่ฉันสามารถใช้ clear code โดยไม่ต้อง bycles
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

เนื่องจากคุณกำลังทำสิ่งนี้ใน Ruby on Rails ดูเหมือนว่าคุณกำลังทำงานกับนางแบบ หากคุณต้องการค่าเริ่มต้นที่เหมาะสมทุกที่ในแอปของคุณคุณสามารถ (เช่น) แทนที่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
มันจะถูกดำเนินการเมื่อทำการโทรดั้งเดิมไม่ใช่ด้วยตัวดำเนินการที่เกี่ยวข้อง อาร์กิวเมนต์ทั้งหมดจะถูกประเมินในการเรียกใช้เมธอด
ทันทู

1

อาจเป็นการดีกว่าที่จะขยาย ActiveRecord หรือแต่ละรุ่นแทน String

ในมุมมองของคุณคุณอาจชอบรูปแบบที่ชัดเจนมากกว่าเช่น

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

นี่เป็นส่วนหนึ่งของ Active Record หรือไม่ ไม่พบข้อมูลอ้างอิงใด ๆ
cabe56

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.