在activesupport回调中堆栈级别太深

Dmy*_*iak 8 ruby activerecord ruby-on-rails activesupport stack-trace

我正在SystemStackError使用Rails 3应用程序.

我拥有的所有信息都是无用的一行堆栈跟踪(取自日志):

SystemStackError (stack level too deep):
  activesupport (3.2.3) lib/active_support/callbacks.rb:409
Run Code Online (Sandbox Code Playgroud)

所以问题是我如何看到完整的堆栈跟踪

注意:我不关心为什么会发生这种情况,我只想知道它发生的地方.

使用:Rails 3.2.3,Unicorn.

谢谢.

And*_*icz 5

如果你在before_save或after_save中更新一个活动记录,它将继续循环....此外,如果你在一个关联的两端都有validates_associated.

以下是before_save回调如何创建循环的示例:

class Foo < ActiveRecord::Base
  def before_save
    self.update_attribute(:bar, 'badidea')
  end
end
Run Code Online (Sandbox Code Playgroud)


Rob*_*Rob 3

lib/active_support/callbacks.rb 中的代码相当复杂,但准确地说,它看起来正在应用各种回调::before、:after、:around。

您可以尝试在第 426 行之前放置一个老式的“puts before #{name}”,然后看看会得到什么。

同样,整个堆栈跟踪可能位于 Rails 堆栈内部,并且它被默认的 backtrace_filter 过滤掉。将 backtrace_filter 关闭可能会让您看到堆栈并获得调试线索。请参阅 config/initializers/backtrace_silencers.rb 并取消注释:

Rails.backtrace_cleaner.remove_silencers!