簡體   English   中英

ActionView :: Template :: Error(nil:NilClass的未定義方法“ each”):

[英]ActionView::Template::Error (undefined method `each' for nil:NilClass):

我在本地沒有遇到錯誤,但是在Heroku上。 錯誤是:

'ActionView :: Template :: Error(nil:NilClass的未定義方法'each')'

“每個”是指下面的User callback.html.erb視圖的<%for i in @positions%>行中的@position中的每個i:

<% 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>

這是我的auth控制器的相關部分(回調部分)

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方法有關,該方法返回nil值,但是我不確定如何解決它。 謝謝!

編輯的授權控制者:

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

因為您捕獲了所有異常並將它們丟棄到垃圾桶中,所以您在這里所做的事情稱為“ Pokemon異常處理”。 這是一個非常不好的習慣,如果您與其他開發人員一起工作,則會導致極大的挫敗感,因為它隱藏了意外的錯誤,使調試工作變得非常困難,因為在這些部分中,您將永遠無法獲得正確的堆棧跟蹤圍牆了。

而不是盲目地捕獲異常,您應該在適用的情況下並且僅在可能會引發異常的情況下捕獲特定的預期異常。 您還應該盡一切努力避免首先生成它們。

例如:

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

調用位置變量i樣式也很差,因為此類名稱通常保留用於增量或索引,僅此而已。 使用稍長但更具描述性的名稱會帶來不可估量的幫助。

您還for x in y循環的for x in y表示法中的for x in y使用了這種非常特殊for x in y方法,其中Ruby鼓勵使用更簡潔的y.each do |x| 版。

進一步,測試是否nil? 而不是僅僅測試對象本身幾乎總是多余的,可以消除。 nil? 測試僅在您要區分falsenil這是Ruby中僅有的兩個非true值)時才有意義。 在這種情況下,簡單的unless (x)if (x.nil?)

至於為什么在@positions沒有得到任何東西,這可能是因為callback例程沒有首先運行。 從外觀上看,除非在那里有return值,否則必須在例程的末尾分配該值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM