假设我有一个User
对象,它具有一个email
属性,并且我需要它们的大写字母的最后一个字母email
:
u = User.find(1)
letter = u.email.upcase.last
如果u
或者email
是nil
在这条产业链,然后我得到一个NoMethodError: undefined method 'blah' for nil:Nilclass
。在大多数情况下,我应该能够解决该问题,但是有时候,它nil
会变得不应该或难以控制。一种方法是冗长的:
u = User.find(1)
letter = nil
if u && u.email
letter = u.email.upcase.last
end
但是,从某种角度看或一长串的观点来看,这很烦人并且很危险a.bunch.of.properties.down.a.hierarchy
。我了解try
了Rails中的方法:
u = User.find(1)
letter = u.try(:email).try(:upcase).try(:last)
这不那么冗长,但是我写所有这些尝试都觉得很讨厌。一旦安装try
了链,我就必须一直使用它们。有没有更好的办法?
我喜欢使用Null对象模式。Avdi有一篇很棒的文章对此进行了解释,但是基本思想是您可以拥有一个小类,可以代表一个对象并对可能传递原始对象的消息进行合理响应。我发现这些方法不仅对避免NoMethodError
s有用,而且对于设置默认值/好的消息也很有用。
例如,您可以执行以下操作:
class NilUser
def email
"(no email address)"
end
end
u = User.find(1) || NilUser.new
u.email.upcase.last # => No errors!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句