Ruby:未定义的方法`[] ='为nil:NilClass

时间:2014-02-01 09:30:58

标签: ruby ruby-on-rails-3.2

抱歉我的英语不好。我得到了如下错误。

undefined method `[]=' for nil:NilClass

app/controllers/tasks_controller.rb:69:in `block in show'
app/controllers/tasks_controller.rb:67:in `each'
app/controllers/tasks_controller.rb:67:in `each_with_index'
app/controllers/tasks_controller.rb:67:in `show'

以下是'tasks_controller.rb'中的代码:

@teammates_form = Array.new(@teammates.size-1){Hash.new}
@teammates.each_with_index do |t, idx|
  if t.id != current_user.id
    @teammates_form[idx]['id'] = t.id  # <--- line 69
    @teammates_form[idx]['name'] = t.name
    @teammates_form[idx]['t_id'] = @task.id
  end
end

但如果我更改代码如下:

@teammates_form[0]['id'] = t.id
@teammates_form[0]['name'] = t.name
@teammates_form[0]['t_id'] = @task.id

它有效...我不知道为什么我不能在数组中使用索引。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您是否检查过使用像Pry这样的错误发生循环的时间?

我怀疑实际上是错误发生的最后一次。在代码的第一行,您可以使用Array.new(@teammates.size-1){Hash.new}创建一个哈希数组。这意味着如果@teammates包含3个项目,则新数组将只包含2个哈希值(即[{}, {}])。这反过来意味着对于最终的队友,@teammates_form[idx]将是零。请尝试使用Array.new(@teammates.size){Hash.new},看看是否有帮助。

答案 1 :(得分:0)

#                                          ⇓⇓  ? WHY?
@teammates_form = Array.new(@teammates.size-1){Hash.new}

您在@teammates的最后一次迭代中产生此错误,因为@teammates_form缩短了1个元素。