运行这样的声明:
undefined method 'email' for nil:NilClass
Ruby会抛出错误nil
,但它应该只返回user
。我在这里做错了什么?
是否会发生,因为在某些情况下organization
|| nil
是.irp r,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
.set _IS_REG_w&r&, 1 ; mark all registers as "REGs"
.set _IS_REG_W&r&, 1
.endr
?
答案 0 :(得分:3)
在self.user.email
中,如果self.user
为nill,则您无法在其上调用email
。
如果您使用的是Ruby 2.3或更新版本,则可以使用safe navigation operator:
self.user&.email || self.organization&.email
注意最后的|| nil
可能是不必要的。
如果您不想向Ruby 2.3或更新版本引入依赖项,可以使用ActiveSupport中的Object#try(包含在Rails中):
self.user.try(:email) || self.organization.try(:email)
答案 1 :(得分:2)
以下代码可以满足您的期望:
user && user.email || organization && organization.email
如果您使用的是ruby >= 2.3.0
,则会有空传播功能:
user&.email || organization&.email
答案 2 :(得分:0)
是的,当用户/组织为零时,会发生错误。它试图从零级别获取电子邮件。因此,您可以添加user.present? || organization.present?
等条件。通过条件后收到电子邮件。如果条件失败,则将其设为零。
答案 3 :(得分:0)
出于好奇:
[user, organization].compact.map(&:email).compact.first
或者,对于Ruby2.3 +
[user, organization].compact.map(&:email).detect(&:itself)