2017-07-26 80 views
-1

運行如下語句:紅寶石:投擲未定義的方法錯誤

self.user.email || self.organization.email || nil 

紅寶石引發錯誤undefined method 'email' for nil:NilClass,但它應該只是返回nil代替。我在這裏做錯了什麼?

它在某些情況下user因爲出現|| organizationnil

+0

是的,你說得對,是某些情況下'用戶== nil'或'組織== nil' –

+0

@IgorDrozdov但我希望它只是跳轉到下一個選項。 – jonhue

回答

3

self.user.email,如果self.user是n,那麼你不能打電話給email就可以了。

如果你使用Ruby 2.3或更高版本,可以使用safe navigation operator

self.user&.email || self.organization&.email 

注意|| nil末可能是unneccesary。

如果你不希望引入一個依賴於Ruby的2.3或更新版本,你可以使用Object#try從的ActiveSupport(包括使用Rails):

self.user.try(:email) || self.organization.try(:email) 
+0

不知道安全導航操作符 - 很好! – jonhue

+1

@jonhue也注意到,'self'這裏是不必要的,除非你除了名稱相同的方法定義的本地變量'user'。 –

0

當用戶/組織爲零是錯誤發生。它試圖從一個無類的電子郵件。所以你可以添加條件,如user.present? || organization.present?。通過條件後獲得電子郵件。如果條件失敗,則爲零。

+0

沒有條件就不可能? – jonhue

+1

不一定。你可以使用「try」,就像@max所說的那樣。 –

2

下面的代碼做你期待什麼:

user && user.email || organization && organization.email 

如果您使用ruby >= 2.3.0,還有空的傳播特點:

user&.email || organization&.email 
+0

另一種選擇是做user.try(:電子郵件)|| organization.try(:電子郵件)。 https://apidock.com/rails/NilClass/try還自我可能是多餘的 –

+0

@NatanRubinstein提供我們開發Rails應用程序。然後我會建議使用'NilClass#try!' –

0

只是出於好奇:

[user, organization].compact.map(&:email).compact.first 

,或者對於Ruby2.3 +

[user, organization].compact.map(&:email).detect(&:itself) 
相關問題