我刚刚将我的gentoo服务器上的ruby安装更新为ruby 1.8.6 patchlevel 287,并开始在我的某个eRuby应用程序上收到错误。 apache error_log文件中给出的错误是:
[error] mod_ruby: /usr/lib/ruby/1.8/cgi.rb:774: superclass mismatch for class Cookie (TypeError)
奇怪的是,它似乎有时会起作用 - 但有时候我会遇到这个错误。任何想法?
答案 0 :(得分: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
因此,您可能只需要grep查找Cookie类的定义,并尝试确保文件始终按正确的顺序排列。这可能是也可能不容易。 :)
答案 1 :(得分:2)
当您重新声明已经声明的类时,会出现该错误,很可能是因为您正在加载两个不同的cgi.rb副本。请参阅similar issue in Rails。