Rails 项目隔个一两天或三五天就报 500 错

xjz19901211 · 2013年04月25日 · 最后由 xjz19901211 回复于 2013年04月26日 · 2767 次阅读

如题,不管进什么路径都会报 500 错误

Rails 错误日志:

A SystemStackError occurred in controller_name#action:

 stack level too deep
 vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.11/lib/active_support/notifications/instrumenter.rb:23

然后我把项目重启一下就好了。。。

项目在服务器上是 Nginx+Unicorn,报错时看了 Nginx 日志,显示 time out,看 Unicorn 日志没有错误日志,真心不知道怎么解了

请大家出出主意,谢谢

现在正在把服务器的更新包都更新下,bundle update 以前也用过了,还是没用。。。

... 这错误日志不是很明显吗? 死循环了。 不管进什么路径都会报500错误 或许某个地方 A redirect_to B then B redirect_to A ? 信息太少 你还是得自己找。

@raven 这样浏览器这边不是会报循环重定向吗?以前这样服务器也不会挂呃。。。

@raven 我等会看看,是不是真的这样的循环重定向

我只是随便推测一下,你的项目没有测试吗?

是不是有脏数据导致循环调用了? 我记得 hacknews 上有过一篇宕机的原因,就是这样的

@raven model, api 写了测试,其它的没了, 现在已有的测试也不怎么全面,没办法。。。

#6 楼 @xjz19901211 那等你修复了这个问题 别忘记加个测试 :p

@Teddy 谢谢,这个我下午也去看看

@raven 项目多,时间少唉。。。。。 痛苦。。

@raven 不过没测试更加痛苦,哈哈

应该是 rails 程序程序里面有死循环了

遇到时,真心是循环!你是否重写了 ORM 层的部分方法?

@shatle 这个真心不知道,现在正在检查项目。。。 好久以前写的代码了,一直放那没用,最近开始用,挂了几次,每次我都是手动再重启。。。

把服务器上的数据弄到本地来,再写了个爬虫,然后在本地的应用里爬,不出一会,本来重现这个错误了,正在看是什么问题。。。

@raven @Teddy @heimirror @shatle 找到目标代码了,比较奇怪,我去研究下。。

# Mongoid
DbUser.default_scope DbUser.where(
  :app_name.in => [nil, project_name]
)

这句代码每次 before_filter 都会执行,运行个几百次后就报错了。。。。。 正在找原因,和修复方法。。。

呃格式打错了。。。

@xjz19901211

一般来说 scope 都是在 model 中定义的

# class methods

default_scope nin(name: [nil, ''])

是否多处定义了?

@shatle 这一句每次进控制器都会执行。。 然后我换成在模型里执行

default_scope -> {
  where(
    :app_name.in => [nil, get_project_name]
  )
}

get_project_name 不同的用户进入都会不同的 但我发现,只有第一次生效了,后面的都不起作用了,就算 get_project_name 的值改了,查询语句还是没变

default_scope 的问题解决了

default_scope -> { where({xx => yy}) }
default_scope where({aa => bb})

上面那样会使得第一个 default_scope 的值永远是第一次运行的结果。。。 把两个顺序换一下,或是把第二个 default_scope 改为

default_scope -> { where({aa => bb}) }

就好了,想去 github 提交下,可是英文不行,还是算了。。。

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