通常我需要检查某个值是否为空并写下“没有数据”,如下所示:
@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
或使用辅助方法或mixins或其他任何东西。什么红宝石的思想,你的经验和最佳实践可以告诉我。
答案 0 :(得分:221)
ActiveSupport将presence
方法添加到所有返回其接收方的对象present?
(与blank?
相反),否则为nil
。
示例:
host = config[:host].presence || 'localhost'
答案 1 :(得分:12)
class String
def |(what)
self.strip.blank? ? what : self
end
end
@user.address | "We don't know user's address"
答案 2 :(得分:2)
因为你在Ruby on Rails中这样做,看起来你正在使用模型。 如果您希望应用中的无处不在的 ,您可以(例如)覆盖 我不太了解ActiveRecord,无法为此提供良好的代码;在续集中它会是这样的: ...但是对于上面的例子,这似乎是你将视图逻辑混合到你的模型中,这不是一个好主意。address
模型的User
方法。< / p>
class User < Sequel::Model
def address
if (val=self[:address]).empty?
"We don't know user's address"
else
val
end
end
end
答案 3 :(得分: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 }
答案 4 :(得分:2)
最好扩展ActiveRecord或单个模型而不是String。
在您看来,您可能更喜欢更明确的模式,例如
@user.attr_or_default :address, "We don't know the user's address"
答案 5 :(得分:0)
Ruby:
unless my_str.empty? then my_str else 'default' end
RoR:
unless my_str.blank? then my_str else 'default' end