Rails 2.4/Ruby 1.8.7からRails 3.1/Ruby 1.9.2にアップグレードするために、従来のコードベースに持ち込まれました。これを実行している間、私は把握しようと3日かかった非常に興味深い問題を発見しました。私は問題を見ている誰かのためにいくつかのGoogleのジュースを与えるために、そして質問をするためにここにドロップしたかった:なぜ?Ruby 1.9.2ではラックレベルのSystemStackErrorで、1.8.7ではありません
基本的には、アプリを実行しているときにラックレベルでSystemStackError
が表示されていました。エラーが発生する前に要求を受け取ることができず、コードに触れなかったのでデバッグできませんでした。開発モードでは、サイトの多くを見ることができ、データベースがヒットしたときに突然SystemStackError
を取得します。だから私はそれが怠惰な読み込みであると思った。
運用モードに切り替えると、最初の要求で例外が発生します。サーバーは正常に起動しますが、要求が送信されず、コードにも触れませんでした。私たちはここを参照してくださいすることはrendering.rb
からlayouts.rb
へurl_for.rb
へmetal.rb
からシステムのサイクリングには
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_dispatch/routing/url_for.rb:102:in `initialize'
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_controller/metal.rb:140:in `initialize'
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/abstract_controller/rendering.rb:74:in `initialize'
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/abstract_controller/layouts.rb:301:in `initialize'
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_dispatch/routing/url_for.rb:103:in `initialize'
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_controller/metal.rb:140:in `initialize'
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/abstract_controller/rendering.rb:74:in `initialize'
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/abstract_controller/layouts.rb:301:in `initialize'
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_dispatch/routing/url_for.rb:103:in `initialize'
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_controller/metal.rb:140:in `initialize'
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/abstract_controller/rendering.rb:74:in `initialize'
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/abstract_controller/layouts.rb:301:in `initialize'
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_dispatch/routing/url_for.rb:103:in `initialize'
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_controller/metal.rb:140:in `initialize'
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/abstract_controller/rendering.rb:74:in `initialize'
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/abstract_controller/layouts.rb:301:in `initialize'
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_dispatch/routing/url_for.rb:103:in `initialize'
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_controller/metal.rb:238:in `new'
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_controller/metal.rb:238:in `block in action'
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_dispatch/routing/route_set.rb:71:in `call'
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_dispatch/routing/route_set.rb:71:in `dispatch'
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_dispatch/routing/route_set.rb:35:in `call'
/Users/john/.rvm/gems/[email protected]/gems/rack-mount-0.8.3/lib/rack/mount/route_set.rb:152:in `block in call'
/Users/john/.rvm/gems/[email protected]/gems/rack-mount-0.8.3/lib/rack/mount/code_generation.rb:96:in `block in recognize'
/Users/john/.rvm/gems/[email protected]/gems/rack-mount-0.8.3/lib/rack/mount/code_generation.rb:68:in `optimized_each'
/Users/john/.rvm/gems/[email protected]/gems/rack-mount-0.8.3/lib/rack/mount/code_generation.rb:95:in `recognize'
/Users/john/.rvm/gems/[email protected]/gems/rack-mount-0.8.3/lib/rack/mount/route_set.rb:141:in `call'
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_dispatch/routing/route_set.rb:538:in `call'
/Users/john/.rvm/gems/[email protected]/gems/omniauth-1.1.0/lib/omniauth/builder.rb:48:in `call'
...
です:
、早送り、あまりにも多くの時間が、私はRailsのループ(full gist)にトレースバックを突き止めurl_for.rb
metal.rb
に等
かなりの努力の後、私は、モデルファイルの先頭に次の行(like so)にこれをダウン追跡:
include ActionView::Helpers::UrlHelpers
注:これはクラス内ではなく、モジュールレベルにあります。
興味深いのは、です。これはRuby 1.8.7で動作しますが、Ruby 1.9.2ではSystemStackError
が発生します。
私はGithub repository illustrating this behaviorを作成しました。
このリポジトリを取得してruby18
ブランチを実行すると、ページをロードできます。 ruby19
ブランチを実行すると、任意のリクエスト(Widgetがロードされていて、本番環境で実行し、遅延ロードされないリクエスト)でSystemStackErrorが発生します。
だから誰にも分かりますか?
Ruby 1.9がモジュールをロードする方法と関係があると思いますが、それは問題ではないようです。は、Railsコアでを引き起こしました。私の主な関心事は、これがコードベースでのプログラミングの怠慢に起因する難解な問題か、それがRubyやRailsの深い問題へのポインタであるかどうかという疑問です。
私は同じ問題があります。私がテストスイート全体を起動した場合は、このエラーが発生しましたが、単一のテストを起動すると、スムーズに動作します。決議のニュースはありますか? thx – gicappa
私の解決策は、ループを引き起こしていた '' 'include ActionView :: Helpers :: UrlHelpers'''を削除することでした。もしあなたがそれを持っていなければ、あなたのコードについて何も知らずに私の疑念があります。 – JohnMetta
ありがとう、私は、テストでActionView :: Helpers :: TagHelperをインクルードしていたことを知りました。 – gicappa