ruby-on-rails 如果字符串为空,则返回某个默认值

m4pnthwp  于 2023-02-14  发布在  Ruby
关注(0)|答案(7)|浏览(159)

我经常需要检查某个值是否为空,然后写上“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思想。

ukdjmx9f

ukdjmx9f1#

ActiveSupport将presence方法添加到所有对象,如果present?(与blank?相反),则返回其接收器,否则返回nil
示例:

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

af7jpaap2#

Phrogz在PofMagicfingers的评论中给了我这个想法,但是重写呢|而不是

class String
  def |(what)
    self.strip.blank? ? what : self
  end
end

@user.address | "We don't know user's address"
omjgkv6w

omjgkv6w3#

由于您是在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

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

bybem2ql

bybem2ql4#

您的方法可能会有一些不想要的副作用,因为即使字符串不为空,也总是计算替代(默认)值。
例如

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

i2loujxw5#

扩展ActiveRecord或单个模型可能比扩展String更好。
在您看来,您可能更喜欢更显式的模式,如

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

8yoxcaq76#

鲁比:

unless my_str.empty? then my_str else 'default' end

RoR:

unless my_str.blank? then my_str else 'default' end
fiei3ece

fiei3ece7#

我推荐使用options. fetch(:myOption,defaultValue),因为它可以很好地处理上面提到的布尔型标志,因此一般来说似乎更好用。
示例

value = {}

puts !!(value.fetch(:condition, true)) # Print true
value = {}
value[:condition] = false

puts !!(value.fetch(:condition, true)) # Print false
value = {}
value[:condition] = true

puts !!(value.fetch(:condition, true)) # Print true
value = {}
value[:condition] = nil

puts !!(value.fetch(:condition, true)) # Print false

相关问题