종종 어떤 값이 비어 있는지 확인하고 다음과 같이 “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