Rails的“ .present”有好处吗?方法?

时间:2019-08-06 14:36:27

标签: ruby-on-rails

在Ruby on Rails中,两者之间有区别吗?

if obj
  # ...
end

和:

if obj.present?
  # ...
end

似乎他们做了同样的事情,并且不使用.present?可以帮助使代码行更短并且可能更干净。我了解.present?blank?相反,但是在尝试确定某个对象是否“真实”时我们应该一直使用它吗?

是否存在某种性能差异?

3 个答案:

答案 0 :(得分:2)

#present?方法的作用还在于,如果字符串是真实但为空的字符串(即""),它还会返回false

这很有用,因为您的表单可能返回空字符串而不是nil

您还可以使用#presence,这是仅当值是#present?时才返回值的有用方法

name = params[:name].presence || 'ardavis'

如果params[:name]是一个空字符串,并且您未使用#presence

,则上述方法将无效

答案 1 :(得分:1)

他们根本不做相同的事情。

在Ruby中,除了nilfalse以外的所有内容都是真实的。与其他流行的动态语言中的类型转换schenigans相比,这真是理智。

irb(main):003:0> !!""
(irb):3: warning: string literal in condition
=> true
irb(main):004:0> !!0
=> true
irb(main):005:0> !![]
=> true
irb(main):006:0> !!{}
=> true
irb(main):007:0> !!Object.new
=> true
irb(main):008:0> !!nil
=> false
irb(main):009:0> !!false
=> false

present?presence是ActiveSupport的一部分,可用于测试nil和false,但实际上在处理用户输入时更有用:

irb(main):010:0> "".present?
=> false
irb(main):011:0> [].present?
=> false
irb(main):012:0> {}.present?
=> false

Rails初学者广泛使用它们,尽管他们不愿意先学习Ruby。如果只想检查是否发送了自变量或是否设置了变量,只需使用隐式真值检查(if foo)或foo.nil?

虽然.present?可以用于ActiveRecord集合,但是还有很多习惯用法上正确的选择,例如any?none?

答案 2 :(得分:0)

如果您正在使用字符串,则仅检查属性或对象是否存在将返回true,但是present方法将返回false。

以下是一些示例:

# Double negation return the boolean value
!!""
=> true


"".present?
=> false

" ".present?
=> false

[].present?
=> false

nil.present?
=> false

true.present?
=> true

false.present?
=> false

{}.present?
=> false

person = {:firstName => "John", :lastName => "Doe"}
person.present?
=> true

5.present?
=> true