2013-07-01 89 views
1

我看了這些帖子上堆棧溢出空白: A concise explanation of nil v. empty v. blank in Ruby on Rails Rails: How do I check if a column has a value?檢查,看是否有場在軌

我也嘗試了一些不同的方法來檢查記錄的存在,但我的代碼仍然拋出一個錯誤:

undefined method `links' for nil:NilClass 

我這是application_controller:

def header_links_when_signedin 
    if signed_in? 
    @header = @current_group.navbars.where(:header => true, :signedin => true).first 
    unless @header.links.first.blank? 
     @header.links 
    end 
    end 
end 

我也得到ŧ他的錯誤在這條線:

unless @header.links.first.blank? 

或在任何地方我包括我以前沒有創建一個鏈接,我打電話導航欄links

一切工作正常,當我創建了字段,我只是覆蓋當用於導航欄的鏈接還沒有創建組的時候的用例。

回答

3

問題是@header是零(沒有找到標題)。爲了避免錯誤,請嘗試:

if @header && @header.links 
    @header.links 
end 

在這裏,您驗證@header@header.links「存在」。順便說一句,你想用你的實例變量@header做什麼?因爲@header.links沒有做任何事情。

+0

謝謝!你是絕對正確的。 –

1

更妙的是:

@header.try(:links) 

這將自動檢查是否@header是零調用它「鏈接」之前。

如果你真的關心你可以這樣做:

@header.try(:links) unless @header.try(:links).try(:empty?) 

但你應該找出原因@header爲零。

+1

http://devblog.avdi.org/2011/06/28/do-or-do-not-there-is-no-try/ –

+1

雖然我同意我不會像這樣連鎖嘗試,但我認爲使用嘗試比明確檢查nil要乾淨得多,而且最終結果都是相同的。另外請注意,鏈接的文章正在處理哈希,它比使用try有更好的方法,關於它的第二篇文章更多地是關於Demeter的問題。 – cpuguy83