4

gentoo サーバーの Ruby インストールを Ruby 1.8.6 パッチレベル 287 に更新したところ、eRuby アプリの 1 つでエラーが発生し始めました。Apache error_log ファイルに表示されるエラーは次のとおりです。

[error] mod_ruby: /usr/lib/ruby/1.8/cgi.rb:774: superclass mismatch for class Cookie (TypeError)

奇妙なことは、それが時々うまくいくように見えることですが、他の時にはそのエラーが発生します。誰でもアイデアはありますか?

4

2 に答える 2

9

エラーメッセージに示されているように、コードのどこかに、以前の定義で使用されたものとは異なるスーパークラスを使用しているCookieクラスの開始、またはCookieクラスの開始があります。

スーパークラスを明示的に指定しないクラス定義でも、スーパークラスがあります。

class Cookie
end

これは、ObjectのスーパークラスでCookieクラスを定義します。

私は以前にこのエラーに遭遇しました。スーパークラスを指定せずにクラスを再度開こうとしているコードがある場合に発生します。プログラマーは、クラス(この場合はCookie)が既に定義されており、いくつかの機能を追加するためにそれを再び開くだけです。ただし、再開と定義の順序が逆の場合、クラスはすでにObjectのサブクラスとして定義されているが、別のスーパークラスで再定義または再開しようとしているため、エラーが発生します。irbでこれを試してください:

% irb
irb(main):001:0> class C < String; end
=> nil
irb(main):002:0> class C; end
=> nil
irb(main):003:0> exit
% irb
irb(main):001:0> class C; end
=> nil
irb(main):002:0> class C < String; end
TypeError: superclass mismatch for class C
        from (irb):2

したがって、Cookieクラスの定義をgrepして、ファイルが常に正しい順序でrequire-dされていることを確認する必要があります。これは簡単な場合とそうでない場合があります。:)

于 2008-10-17T04:08:24.237 に答える
2

このエラーは、既に宣言されているクラスを再宣言すると表示されます。これは、cgi.rb の 2 つの異なるコピーをロードしていることが原因である可能性が最も高いです。Rails で同様の問題を参照してください。

于 2008-09-24T18:48:40.840 に答える