如果string为空,则返回一些默认值

通常我需要检查一些值是否为空,并写下“没有数据存在”

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

而当我们有大约20-30个这样需要处理的领域时,这个领域变得很难看。

我所做的是扩展string类or方法

 class String def or(what) self.strip.blank? ? what : self end end @user.address.or("We don't know user's address") 

现在看起来好多了。 但它仍然是粗糙和粗糙的

怎样才能解决我的问题呢? 也许最好是扩展ActiveSupport class或使用助手方法或混合或其他任何东西。 什么ruby的idealogy,你的经验和最佳实践可以告诉我。

ActiveSupport将presence方法添加到返回其接收器(如果present?所有对象present?blank?的对面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中这样做,看起来你正在使用一个模型。 如果你想在你的应用程序的每个地方使用合理的默认值,你可以(例如)覆盖你的User模型的address方法。

我不太了解ActiveRecord,为此提供了很好的代码; 在续集中它会是这样的:

 class User < Sequel::Model def address if (val=self[:address]).empty? "We don't know user's address" else val end end end 

…但是对于上面的例子,这看起来像是将视图逻辑混合到你的模型中,这不是一个好主意。

您的方法可能会有一些不必要的副作用,因为即使string不是空的,也会始终评估替代(默认)值。

例如

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

扩展ActiveRecord或单个模型而不是String可能会更好。

在你看来,你可能更喜欢更明确的模式

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