Rails rails 中 stack level too deep 异常问题请教。

hhuai · 2012年02月28日 · 最后由 wyk 回复于 2013年09月17日 · 12106 次阅读

访问一个 controller 的 index 方法时,报以下错误,rails 进程退出

script/rails:8: stack level too deep (SystemStackError)

就这一句,没有堆栈信息,还没找到调试方法。 根本还没有进入 controller,按理说应该是进入 controller 之前的问题,但另一个 controller 访问正常。 苦了我很久了,我还没弄清这句异常从哪 catch 掉了。 下面是 script/rails 的代码,rescue 那里是我自己加上的。

begin
require 'rails/commands'
rescue Exception=>e
  raise '这里根本不会抛出来。。。'
end

死循环了

递归调用了?

对,是死循环递归调用了,但从何开始调呢,这个堆栈没抛出来,我现在根本不知道在哪一块出的错。

而且肯定还没进我的用户代码,还在 rails 框架层里面。

那个 index 方法没问题吗?

是的,因为还没进入那个 index 方法。

试试这个,也许你能看到无数重复的调用:

set_trace_func proc { |event, file, line, id, binding, classname|
  printf "%8s %s:%-2d %10s %8s\n", event, file, line, id, classname
}
require 'rails/commands'

这个出问题的 controller 是不是有一些被禁止使用的方法,比如 response 之类的

#7 楼 @yangyanhao 哈哈,我们心有灵犀了,我刚用这个试完。

proc_object = proc do |event, file, line, id, binding, klass|
  puts "#{event} in #{file}/#{line} #{id} #{klass}"
end
set_trace_func(proc_object)
require 'rails/commands'

机器卡了一阵后,发现有大量关于 mongoid 的输出,仔细看相关代码,发现其中有个 model 不知道怎么写成这样了。

  include Mongoid::Document
class DataForm
  include Mongoid::MultiParameterAttributes

改好后就可以了。

加载 controller 就立马加载对应 model, 难怪还没进 index 方法就跑进 model 了。

菜鸟弱问一下那一段代码写在什么地方?

需要 登录 后方可回复, 如果你还没有账号请 注册新账号