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

时间:2011-01-27 14:03:03

标签: ruby-on-rails ruby

通常我需要检查某个值是否为空并写下“没有数据”,如下所示:

@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或其他任何东西。什么红宝石的思想,你的经验和最佳实践可以告诉我。

6 个答案:

答案 0 :(得分:221)

ActiveSupport将presence方法添加到所有返回其接收方的对象present?(与blank?相反),否则为nil

示例:

host = config[:host].presence || 'localhost'

答案 1 :(得分:12)

Phrogz在PofMagicfingers评论中给了我一个想法,但是覆盖了什么呢?代替?

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中这样做,看起来你正在使用模型。 如果您希望应用中的无处不在的 ,您可以(例如)覆盖address模型的User方法。< / p>

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

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