2012-08-22 129 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,否则那个值必须在程序结束时分配。

相关问题