2012-08-22 128 views
0

我在本地沒有遇到錯誤,但是在Heroku上。錯誤是:ActionView :: Template :: Error(未定義方法`each'for nil:NilClass):

'::的ActionView模板::錯誤(未定義的方法`每個' 爲無:NilClass)」

在 '每個' 指的是每個i在@position在<%爲i的下面我的用戶callback.html.erb鑑於@positions%>行:

<% for i in @positions %> 
<strong> 
<% begin %> 
<%= @user.positions.find_by_id(i).title + " at " %> 
<% rescue %> 
<% end %> 

<% begin %> 
<%= @user.positions.find_by_id(i).company %> 
<% rescue %> 
<% end %> 
</strong> 

這是我的身份驗證控制器的相關部分(回調部)

def callback 

... 

    @user = current_user 

... 

    #positions 
    for i in 0..(positions.count-1) 

     begin 
     @company_i = companies[i]['name'] 
     rescue 
     end 

     begin 
     @title_i = positions[i]['title'] 
     rescue 
     end 

     begin 
     @industry_i = companies[i]['industry'] 
     rescue 
     end 

     begin 
     @start_month_i = positions[i]['start-date']['month'] 
     @start_year_i = positions[i]['start-date']['year'] 
     rescue 
     end 

     begin 
     @end_month_i = positions[i]['end-date']['month'] 
     @end_year_i = positions[i]['end-date']['year'] 
     rescue 
     end 

     begin 
     @li_pos_id_i = positions[i]['id'] 
     rescue 
     end 

     if Position.find_by_li_pos_id(@li_pos_id_i).nil? 
     @user.positions.build(li_pos_id: @li_pos_id_i, company: @company_i, title: @title_i, 
      industry: @industry_i, start_month: @start_month_i, start_year: @start_year_i, 
      end_month: @end_month_i, end_year: @end_year_i) 
     end 
    end 

    @user.save 
    @positions = @user.positions.map(&:id) 
end 

我認爲它有這樣用我的.find_by方法處理返回一個零值,但我不知道如何解決它。謝謝!

EDITED AUTH控制器:

positions.each do |position| 
     begin 
     @li_pos_id = position.id 
     @title = position.title 
     @company = position.company.name 
     @industry = position.company.industry 
     @start_month = position.start_date.month 
     @start_year = position.start_date.year 
     @end_month = position.end_date.month 
     @end_year = position.end_date.year 
     rescue 
     end 

     unless Position.find_by_li_pos_id(@li_pos_id) 
     current_user.positions.build(li_pos_id: @li_pos_id, title: @title, company: @company, industry: @industry, 
      start_month: @start_month, start_year: @start_year, end_month: @end_month, end_year: @end_year) 
     end 

     @user.save 
     @user.positions.save 
    end 
+0

您確定當前用戶在生產中創建了職位嗎?該關聯中可能沒有任何對象 –

+0

在這種情況下'map'將返回一個空數組。 – tadman

+0

@tadman這絕對是醜陋的,謝謝你的意見。我修改了它並粘貼在編輯中。問題在於位置模型數據(User has_many positions)沒有保存到heroku數據庫。任何想法爲什麼?我的用戶數據保存得很好 – keypulsations

回答

4

你在做什麼在這裏被稱爲「口袋妖怪異常處理」,因爲你捕獲所有的異常,並在垃圾桶扔。如果您與其他開發人員一起工作在一個團隊中,這是一個非常糟糕的開發習慣,並且會導致大量的挫敗感,因爲它隱藏了意想不到的錯誤,並且使調試變得更加困難,因爲在這些部分中,您永遠不會得到正確的堆棧跟蹤被關閉了。

不應該盲目捕捉異常,而應該捕捉特定的,預期的異常(如果適用),並且只在可能引發異常的地方。您還應盡一切努力避免首先產生它們。

這方面的一個例子是:

<% @position_ids.present? and @position_ids.each do |position_id| %> 

呼喚你的位置變量i也可作爲之類的名稱通常被保留,增量或索引,僅此而已風格非常差。使用稍長一點但更具描述性的名字有助於無法估量。

您也正在使用這種非常奇特的for x in y表示法,其中Ruby鼓勵使用更簡潔的y.each do |x|版本。

此外,測試nil?而不僅僅是測試對象本身幾乎總是多餘的,可以消除。 nil?測試僅在您想區分falsenil時才相關,這是Ruby中唯一的兩個非真值。在這種情況下,簡單的unless (x)if (x.nil?)更好。

至於爲什麼你在@positions沒有得到任何東西,這可能是因爲callback例程不是首先運行。從外觀上看,除非在那裏有return,否則那個值必須在程序結束時分配。

相關問題