我经常需要检查某个值是否为空,然后写上“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
或者使用helper方法或者mixin或者其他方法会更好。你的经验和最佳实践可以告诉我什么样的ruby思想。
7条答案
按热度按时间ukdjmx9f1#
ActiveSupport将
presence
方法添加到所有对象,如果present?
(与blank?
相反),则返回其接收器,否则返回nil
。示例:
af7jpaap2#
Phrogz在PofMagicfingers的评论中给了我这个想法,但是重写呢|而不是
omjgkv6w3#
由于您是在Ruby on Rails中执行此操作的,因此看起来像是在处理模型。* 如果 * 您希望在应用中 * 任何地方 * 都有合理的默认值,您可以(例如)为
User
模型覆盖address
方法。我对ActiveRecord的了解还不足以提供好的代码;在续集中,它可能是这样:
......但是对于上面的例子来说,这看起来像是将视图逻辑混合到模型中,这不是一个好主意。
bybem2ql4#
您的或方法可能会有一些不想要的副作用,因为即使字符串不为空,也总是计算替代(默认)值。
例如
即使地址不为空,也会产生额外的工作。也许您可以稍微更新一下(很抱歉混淆了一行程序,尽量保持简短):
i2loujxw5#
扩展ActiveRecord或单个模型可能比扩展String更好。
在您看来,您可能更喜欢更显式的模式,如
8yoxcaq76#
鲁比:
RoR:
fiei3ece7#
我推荐使用options. fetch(:myOption,defaultValue),因为它可以很好地处理上面提到的布尔型标志,因此一般来说似乎更好用。
示例