- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我被引入遗留代码库,将其从 Rails 2.4/Ruby 1.8.7 升级到 Rails 3.1/Ruby 1.9.2。在这样做的过程中,我发现了一个非常有趣的问题,花了 3 天时间才弄明白。我想把它放在这里,既是为了给它一些谷歌汁,让其他人看到这个问题,也是为了问这个问题:为什么?
基本上,在运行我的应用程序时,我在 Rack 级别看到了 SystemStackError
。在错误发生之前我无法通过任何请求,并且无法调试它,因为我的代码从未被触及过。在开发模式下,我可以看到网站的大部分内容,然后在访问数据库时突然收到 SystemStackError
。所以我认为这是延迟加载。
切换到生产模式,异常发生在第一个请求上。服务器正常启动,但没有请求通过,我的代码也没有被触及。
快进太多小时,我追踪回溯到 Rails 中的一个循环 (full gist):
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/action_dispatch/routing/url_for.rb:102:in `initialize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/action_controller/metal.rb:140:in `initialize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/abstract_controller/rendering.rb:74:in `initialize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/abstract_controller/layouts.rb:301:in `initialize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/action_dispatch/routing/url_for.rb:103:in `initialize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/action_controller/metal.rb:140:in `initialize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/abstract_controller/rendering.rb:74:in `initialize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/abstract_controller/layouts.rb:301:in `initialize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/action_dispatch/routing/url_for.rb:103:in `initialize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/action_controller/metal.rb:140:in `initialize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/abstract_controller/rendering.rb:74:in `initialize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/abstract_controller/layouts.rb:301:in `initialize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/action_dispatch/routing/url_for.rb:103:in `initialize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/action_controller/metal.rb:140:in `initialize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/abstract_controller/rendering.rb:74:in `initialize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/abstract_controller/layouts.rb:301:in `initialize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/action_dispatch/routing/url_for.rb:103:in `initialize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/action_controller/metal.rb:238:in `new'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/action_controller/metal.rb:238:in `block in action'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/action_dispatch/routing/route_set.rb:71:in `call'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/action_dispatch/routing/route_set.rb:71:in `dispatch'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/action_dispatch/routing/route_set.rb:35:in `call'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/rack-mount-0.8.3/lib/rack/mount/route_set.rb:152:in `block in call'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/rack-mount-0.8.3/lib/rack/mount/code_generation.rb:96:in `block in recognize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/rack-mount-0.8.3/lib/rack/mount/code_generation.rb:68:in `optimized_each'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/rack-mount-0.8.3/lib/rack/mount/code_generation.rb:95:in `recognize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/rack-mount-0.8.3/lib/rack/mount/route_set.rb:141:in `call'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/action_dispatch/routing/route_set.rb:538:in `call'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/omniauth-1.1.0/lib/omniauth/builder.rb:48:in `call'
...
我们在这里看到的是系统从 metal.rb
循环到 url_for.rb
到 layouts.rb
到 rendering。 rb
到 metal.rb
到 url_for.rb
等
经过相当大的努力,我追踪到模型文件顶部的以下行 (like so):
include ActionView::Helpers::UrlHelpers
请注意,这不是在类内部,而是在模块级别。
有趣的是,这在 Ruby 1.8.7 中有效,但在 Ruby 1.9.2 中会导致 SystemStackError
。
我创建了一个 Github repository illustrating this behavior .
如果你获取这个存储库,并运行 ruby18
分支,你可以加载一个页面。如果你运行 ruby19
分支,你会在任何请求上得到一个 SystemStackError(任何加载 Widget 的请求,在生产环境中运行它,它不会延迟加载)。
所以,有人知道为什么吗?
我的意思是,我想这与 Ruby 1.9 加载模块的方式有关,因为它似乎不是由 Rails 核心引起的问题。我主要关心的问题是,这是否只是代码库中惰性编程实践导致的深奥问题,或者它是否指向更深层次的问题,无论是在 Ruby 还是 Rails 中。
最佳答案
这看起来像 Bug 3144 , 表示直接引用助手。
Rails.application.routes.url_helpers
关于ruby - Ruby 1.9.2 中机架级别的 SystemStackError,而不是 1.8.7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11055656/
我知道这里有很多系统堆栈错误问题……但每个问题和答案都是独一无二的。还没有找到一个接近我的。 我真的不明白为什么会出现这个错误... 我不需要 View ,因为表单是通过 ajax 发送的。我用 Ra
我想做这个简单的计算,但它提示堆栈不够深,即使对于 n 的非常小的数字(例如 4)也是如此。类似主题的其他 SO 帖子推荐尾递归,但是这在这里不适用,因为您只在达到基本情况时才添加到累积值。 Ruby
我有 Sinatra 应用程序,需要测试我的应用程序。 features/support/env.rb: require_relative "../../application" require "c
我有以下代码: class BookPrice attr_accessor :price def initialize(price) @price = price end de
我正在开发一个 android 应用程序,我需要有一个关于已保存对象的显示 View 的 json 响应。尝试这样做,我收到: "SystemStackError (stack level too d
这是我的代码。 @@inversions = 0 numbers = [very big array] def merge_sort(array) return array if array.si
我正在研究一种新的编程语言 rip ,而且我无法找到一些无限循环的底部。有没有办法在每个规则被调用时打印出来,这样我就可以看到递归的规则?我试过在脑海中遍历代码,但我就是看不到它。任何帮助将不胜感激。
不确定为什么会这样??还是菜鸟.. 我只是在保存记录之前更新 Mine 表中的一个字段。所有变量都被准确地引入了。下面的行也返回了它应该的内容。 CreateFulfillmentService::N
我有很多范围,如果它们重叠,我想合并在一起。我目前使用的方法是使用 Sets。 这是有效的。但是,当我尝试使用如下更大范围的相同代码时,我得到一个“堆栈级别太深(SystemStackError)”。
我尝试解决这个问题http://www.nattee.net/~dae/algo/prob/hw03b_tiling/problem.pdf 所以我使用分而治之的方法来解决它但是当我执行我的程序时我得
所以我正在尝试创建 vagrantfile 循环并为学校项目创建多台机器。 代码是: def slave() slave{i} end Vagrant.configure(2) do |confi
删除记录时出现堆栈溢出错误: SystemStackError (stack level too deep): app/controllers/orders_controller.rb:18:in `
我正在尝试向 Numeric 类添加转换方法,但是当我运行以下代码行时,我得到了 SystemStackError puts 5.dollars.in(:euros) # => 6.5 puts 1
我试图理解为什么将许多(在我的例子中是 130798 个)对象放入数组中会返回 SystemStackError。 big = Array.new(130797, 1) [].push(*big) &
Ruby 在 Cygwin 中的 rails 和 bundler 崩溃。 $ ruby -v ruby 1.9.3p374 (2013-01-15 revision 38858) [i386-cygw
不明白为什么我运行这个程序时堆栈级别太深。 module A class Fruit def initialize puts "pears" end
所以我试图在 ruby 中实现快速排序,但我得到了这个错误 `quicksort': stack level too deep (SystemStackError) def quicksort(a
下面是我的示例代码: def test(v) test(v-1) if v > 0 p v end 如果我调用 test(11893) 它工作正常。如果我有 v > 11893,它会抛出 Sy
当我在程序中对其进行测试时,我的代码将运行,但是当我尝试在该代码上运行Rspec时,它将引发错误 rails--version Rails 5.2.3 ruby --version ruby 2.6.
我有一个表单,当用户在文本字段中输入某些值时,我想自动填充其他字段,但它不断返回 SystemStackError (堆栈级别太深)。这是文件: 路线.rb scope :places, contro
我是一名优秀的程序员,十分优秀!