POSTS
Rails中try的用法
我们经常会遇到的下面的场景:
@person && @persion.name # 需确保@person不是nil,否则会报错
NoMethodError: undefined method `name' for nil:NilClass
用 try 改写:
@person.try(:name) # 如果@person为nil则返回nil而不是报错
等同于 @person ? @person.name : nil
@person.try { |p| "#{p.first_name} #{p.last_name}" }
try 同样能接受参数、block,
Person.try(:find, 1)
@people.try(:collect) {|p| p.name}
当对象或者模型没有某个属性时,通常会抛出异常,使用try后只会返回nil:
2.6.2 :001 > User.first.name
Traceback (most recent call last):
1: from (irb):1
NoMethodError (undefined method `name' for #<User:0x00007f8606a0d1b8>)
2.6.2 :002 > User.first.try(:name)
=> nil
2.6.2 :001 > nil.try(:name)
=> nil
我们经常会写的代码如下:
if user && user.email
# do something
end
使用try方法:
if user.try(:email)
# do something
end
值得注意的是,try这个method并不存在Ruby中,而是仅能在Rails中使用。但是ruby2.3以上版本中的&.语法,与try能实现相同的效果:
# Ruby <= 2.2.x
if user && user.admin?
# do something
end
# Ruby 2.3
if user&.admin?
# do something
end