ActionView :: Template :: Error(未定义的方法`每个'为nil:NilClass):

时间:2012-08-22 17:31:38

标签: ruby-on-rails heroku

我没有在本地遇到错误,但我在Heroku上。错误是:

'ActionView :: Template :: Error(未定义的方法`每个'为nil:NilClass)'

'each'指的是位于@positions%的<%for i中的@position中的每个i;我的用户callback.html.erb视图行在下面:

<% 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值,但我不知道如何修复它。谢谢!

EDITED AUTH CONTROLLER:

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

1 个答案:

答案 0 :(得分:4)

你在这里所做的事情被称为“口袋妖怪异常处理”,因为你捕获所有异常并将它们扔进垃圾桶。这是一个非常糟糕的习惯,如果你正在与其他开发人员一起工作,因为它隐藏了意外错误并使调试变得更加困难,因为在这些部分中你永远不会得到正确的堆栈跟踪,这会导致巨大的挫败感已被围住了。

除了盲目地捕获异常外,您应该在适用的情况下捕获特定的预期异常,并且仅在可能被引发的情况下捕获。您还应该尽一切努力避免首先产生它们。

这方面的一个例子是:

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

调用位置变量i也是非常差的样式,因为该类型的名称通常保留用于增量或索引,仅此而已。使用稍长但更具描述性的名称有助于无法估量。

你也在使用这种非常奇特的for x in y符号来表示循环,其中Ruby鼓励使用更简洁的y.each do |x|版本。

此外,测试nil?而不仅仅测试对象本身几乎总是多余的,可以消除。仅当您要区分nil?false时,nil测试才有意义,这是Ruby中唯一的两个非真值。在这种情况下,简单的unless (x)优于if (x.nil?)

至于为什么你没有在@positions中得到任何东西,这可能是因为callback例程并没有在第一时间运行。从事物的外观来看,除非那里有某个return,否则必须在例程结束时分配该值。