運行如下語句:紅寶石:投擲未定義的方法錯誤
self.user.email || self.organization.email || nil
紅寶石引發錯誤undefined method 'email' for nil:NilClass
,但它應該只是返回nil
代替。我在這裏做錯了什麼?
它在某些情況下user
因爲出現|| organization
是nil
?
運行如下語句:紅寶石:投擲未定義的方法錯誤
self.user.email || self.organization.email || nil
紅寶石引發錯誤undefined method 'email' for nil:NilClass
,但它應該只是返回nil
代替。我在這裏做錯了什麼?
它在某些情況下user
因爲出現|| organization
是nil
?
在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)
不知道安全導航操作符 - 很好! – jonhue
@jonhue也注意到,'self'這裏是不必要的,除非你除了名稱相同的方法定義的本地變量'user'。 –
當用戶/組織爲零是錯誤發生。它試圖從一個無類的電子郵件。所以你可以添加條件,如user.present? || organization.present?
。通過條件後獲得電子郵件。如果條件失敗,則爲零。
沒有條件就不可能? – jonhue
不一定。你可以使用「try」,就像@max所說的那樣。 –
下面的代碼做你期待什麼:
user && user.email || organization && organization.email
如果您使用ruby >= 2.3.0
,還有空的傳播特點:
user&.email || organization&.email
另一種選擇是做user.try(:電子郵件)|| organization.try(:電子郵件)。 https://apidock.com/rails/NilClass/try還自我可能是多餘的 –
@NatanRubinstein提供我們開發Rails應用程序。然後我會建議使用'NilClass#try!' –
只是出於好奇:
[user, organization].compact.map(&:email).compact.first
,或者對於Ruby2.3 +
[user, organization].compact.map(&:email).detect(&:itself)
是的,你說得對,是某些情況下'用戶== nil'或'組織== nil' –
@IgorDrozdov但我希望它只是跳轉到下一個選項。 – jonhue