我有一个使用来自 github vhochstein/master 的活动脚手架的 3.0.7 应用程序。我正在使用可用作供应商/插件的 3.x 兼容版本,而不需要安装 gem。
在生产中,它会遇到 ActionView::Template::Error(堆栈级别太深):。
beaumont@edouard:~/beaumont/current$ script/rails server -p 4000
ActionView::Template::Error (stack level too deep):
8: depth = Kernel.caller.count
9: logger.info "pagination: #{@page} #{depth}"
10: %>
11: <%= render :partial => 'list_pagination_links', :locals => { :current_page => @page } if @page.pager.infinite? || @page.pager.number_of_pages > 1 %>
12: </div>
13: <br clear="both" /><%# a hack for the Rico Corner problem %>
14: </div>
我首先在我的代码中寻找一些递归,然后在我的数据模型中寻找循环,这搞砸了 AS。它首先发生在 mod_passenger 中,但它也发生在脚本/rails 服务器运行登录到服务器时。(这是我的beta测试机)
它总是在 Rendered vendor/plugins/active_scaffold/frontends/default/views/_list_pagination.html.erb(144.3ms 157) 中消失。我破解了 ActionView 来记录 Kernel.caller.count 以便我可以看到堆栈是否在增长,但我没有看到这一点。我确实看到堆栈深度高达 180。如果我 ulimit -s 在启动 rails 之前堆栈更大,这似乎并不重要,但也许有些东西会再次 ulimit 堆栈。
在_list_pagination.html.erb 中,它调用list_pagination_links。如果我注释掉那个调用,那么事情就不会失败。我试着让 list_pagination_links 什么都不做(里面没有代码!),但它仍然在那个渲染调用中死掉了。我想知道堆栈是否在渲染代码本身中是递归的,或者只是太大了。
这不会发生在我的笔记本电脑(debian sequeeze,32 位)的开发模式下,但会发生在我的测试版生产机器(XEN VM,32 位,debian 挤压)上。它有时确实发生在我的笔记本电脑上,但不是以可重复的方式发生,重新启动 rails “解决”了这些问题。我还没有在我的笔记本电脑上尝试过生产模式,我也怀疑它可能与数据有关!