2014-11-05 56 views
1

我試圖本法干擾適用於@ post.author的觀點,但我得到未定義的方法'驗證」的零:NilClass

undefined method 'verified' for nil:NilClass

def showVerifiedIcon(user) 
    u = User.where(username: user).first 
    if u.verified? 
    '<i class="fa fa-check-circle verified-icon fa-lg"></i>' 
    else 
    end 
end 

回答

2

的最佳方式用戶的方法在你不確定它們是否爲零的對象上是用戶嘗試。 你的情況:

def showVerifiedIcon(user) 
    u = User.find_by_username(user) 
    if u.try(:verified?) #will return nil if u is nil 
    '<i class="fa fa-check-circle verified-icon fa-lg"></i>' 
    else 
    end 
end 
+1

'User.find_by(...)'比更簡潔'User.where(...)。first'。 – tadman 2014-11-05 20:47:37

+0

確定在我的答案中編輯它,我會接受 – 2014-11-05 20:52:01

+0

我個人不喜歡'try',每當我在代碼庫中找到它時,它就像是一種代碼味道。原因是,當你使用嘗試,你沒有任何信心,如果你有你的對象不。它違反了「告訴,不要求原則」。 – Barbared 2014-11-05 21:48:49

2

的問題是,你不知道是否User.where(username: user).first返回你期待與否的對象。 如果不是那個查詢將返回nil,那麼在您的下一行中,您將調用verified方法nil導致您看到的錯誤。

如果您不確定自己的方法可能會返回nil,您應該始終保護自己。在你的例子中,很容易發現,但是在一個稍微複雜的架構中,在調用一個方法之前,最終可能會在幾個類中傳遞nil,這使得debbuging變得非常棘手。做調用任何方法之前

經常檢查:

def showVerifiedIcon(name) 
    '<i class="fa fa-check-circle verified-icon fa-lg"></i>' if user(name) 
end 

private 

def user(name) 
    User.find_by_username(name) 
end 

如果User.find_by_username回報nil那麼你的if語句,不會令你HTML元素

+0

現在我得到'錯誤的參數數量(0爲1)' – Un3qual 2014-11-05 22:01:19

+0

@ Un3qual是因爲我忘記了之前通過用戶:) 我編輯了答案 – Barbared 2014-11-05 22:04:58

相關問題