Ruby:抛出未定义的方法错误

时间:2017-07-26 07:48:38

标签: ruby-on-rails ruby methods

运行这样的声明:

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

4 个答案:

答案 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)