문자열이 비어 있으면 일부 기본값을 반환합니다.


93

종종 어떤 값이 비어 있는지 확인하고 다음과 같이 "No data present"라고 써야합니다.

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

이렇게 처리해야하는 약 20 ~ 30 개의 필드가 있으면 추악 해집니다.

내가 만든 것은 or메서드 가있는 확장 된 String 클래스입니다.

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
이것은 멋지다. 기본 레일 가능성이 우선됩니다. 고맙습니다!
fl00r 2011 년

첫째로 내 솔루션에서 적어도 String, Fixnum 및 NilClass를 확장해야하기 때문에 선호됩니다. 그리고 여기에서는 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에서이 작업을 수행하고 있으므로 모델로 작업하는 것처럼 보입니다. 경우 당신이 합리적인 디폴트 값을 원하는 어디서나 앱에, 당신은 (예를 들어)를 오버라이드 (override) 수 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

... 위의 예에서는 뷰 로직을 모델에 혼합하는 것처럼 보이지만 이는 좋은 생각이 아닙니다.


예, 모델에서 기본값을 설정하는 것은 좋지 않습니다. :) 내 양식이 울
립니다

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
삼항 연산자가 아닌 원래 호출을 할 때 실행됩니다. 모든 인수는 메서드 호출시 평가됩니다.
Tonttu 2011 년

2

String 대신 ActiveRecord 또는 개별 모델을 확장하는 것이 좋습니다.

귀하의 견해로는 다음과 같은보다 명확한 패턴을 선호 할 수 있습니다.

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

Active Record의 일부입니까? 참조를 찾지 못했습니다.
cabe56

0

루비:

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

RoR :

unless my_str.blank? then my_str else 'default' end
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.