[ruby-on-rails] 문자열이 비어 있으면 일부 기본값을 반환합니다.

종종 어떤 값이 비어 있는지 확인하고 다음과 같이 “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도우미 메서드 나 믹스 인 등 을 확장 하거나 사용하는 것이 더 나을 수도 있습니다 . 루비 아이디어, 귀하의 경험 및 모범 사례가 나에게 알려주는 것은 무엇입니까?



답변

ActiveSupport은 추가 presence리시버 경우 리턴 모든 객체 방법 present?(반대 blank?)와 nil그렇지.

예:

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


답변

Phrogz는 PofMagicfingers 코멘트에서 아이디어를주었습니다. 그러나 재정의는 어떻습니까? 대신?

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

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


답변

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

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


답변

귀하의 또는 대체 (기본값) 값이 항상 평가되기 때문에 방법은 문자열이 비어 있지 않은 경우에도, 일부 원하지 않는 부작용이있을 수 있습니다.

예를 들면

@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 }


답변

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

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

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


답변

루비:

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

RoR :

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


답변