如果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"