繁体   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