我想返回mycollection.first.user.name
,但mycollection
或mycollection.first
可能爲零。下面的代碼很難看,但作品:返回前檢查多個條件
if mycollection && mycollection.first && mycollection.first.user
mycollection.first.user.name
end
什麼是Ruby方式?
我想返回mycollection.first.user.name
,但mycollection
或mycollection.first
可能爲零。下面的代碼很難看,但作品:返回前檢查多個條件
if mycollection && mycollection.first && mycollection.first.user
mycollection.first.user.name
end
什麼是Ruby方式?
如果你碰巧使用Rails,將它添加到Object
的方法稱爲try
這可能幫助:
mycollection.try(:first).try(:user).try(:name)
,將調用first
,user
和name
順序,但如果在任何一個值,鏈條是nil
,它只會返回nil
而不會引發異常。
如果你不使用Rails,你可以很容易把它定義自己:
class Object; def try(method,*args,&block); send(method,*args,&block); end end
class NilClass; def try(method,*args,&block); nil; end end
有些人不嘗試太熱衷(),但可以肯定的是,你可能會喜歡的一種方法。
name = mycollection.try(:first).try(:user).try(:name)
如果任何內容爲零,或者將返回名稱的值,名稱將爲零。
此外,您可能需要重構你的模型,這樣你可以調用這樣的事情:
item.user_name
class ItemClass
def user_name
user.try(:name)
end
end
與項目是集合中的第一個。
name = if mycollection && item = mycollection.first
item.user_name
end
在純Ruby,你可以這樣做:
if mycollection && mycollection.first.respond_to?(:user)
mycollection.first.user.name
end
這是因爲,如果mycollection
是一個空數組,mycollection.first
將返回nil:
irb(main):002:0> nil.respond_to?(:user)
false
有點晚=)看起來像亞歷克斯有一個更詳細的答案。 –