操作系统:Mac OSX 10.6
在我的终端中,我使用“rails c”启动Ruby控制台
在按照Ruby on Rails 3教程构建类时:
class Word < String
def palindrome? #check if a string is a palindrome
self == self.reverse
end
end
我得到错误消息:
TypeError: superclass mismatch for class Word
from (irb):33
from /Users/matthew/.rvm/gems/ruby-1.9.2-p180@rails3tutorial/gems/railties-3.0.5/lib/rails/commands/console.rb:44:in `start'
from /Users/matthew/.rvm/gems/ruby-1.9.2-p180@rails3tutorial/gems/railties-3.0.5/lib/rails/commands/console.rb:8:in `start'
from /Users/matthew/.rvm/gems/ruby-1.9.2-p180@rails3tutorial/gems/railties-3.0.5/lib/rails/commands.rb:23:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'
教程显示它没有问题,我知道代码是好的;我搜索了其他相关的问题,但它们都涉及到从Ruby 2迁移到Ruby 3或者erb与eruby。
6条答案
按热度按时间np8igboo1#
您已经在其他地方定义了一个
Word
类。我尝试在Rails3应用程序中进行复制,但无法复制。如果您自己还没有创建第二个
Word
类,则可能是您的Gem或插件之一已经定义了它。3npbholx2#
这也可能发生如下情况:
require在
Document < ActiveRecord::Base
(具有不同的超类)之前加载Document
(具有Object超类)。我应该注意到,在Rails环境中通常不需要require,因为它具有自动类加载功能。
ruoxqz4g3#
我在使用Rails 4应用程序时遇到了这个问题,我在用户名称空间下使用了concerns。
在开发中一切正常,但在生产中(我猜是因为preload_app true)我得到了不匹配的错误。修复非常简单。我只是添加了一个初始化器:
干杯!
gjmwrych4#
有时候我们在不知道的情况下“打开类”。例如,一些深模块嵌套:
当我们定义触发器时,我们打开了现有的SpaceGun类。这是有效的。但是,如果我们以相反的顺序加载这两个文件,则会引发错误,因为我们将首先定义SpaceGun类,而不是武器。
有时候我们会犯这个错误,因为我们显式地需要父类的子模块(例如触发器)。这意味着类定义将以相反的顺序完成,从而导致这个问题。
或者
1.依靠自动装载
1.总是将继承放置到每个开放类的示例中。
zzzyeukh5#
我现在遇到了同样的问题。基本上这意味着Word在其他地方被定义为一个类,我猜它在rail-ties gem上。只要将Word更改为Word 2,它就可以在教程中正常工作。
ufj5ltwl6#
根据您的具体情况,任何已经提供的答案都可能是您的解决方案。
为了快速方便地找到答案,临时设置
config.eager_load = true
并启动rails控制台,它应该会立即失败,并显示一条更明确的错误消息,指出正确的文件和行号。不要忘记在之后将
config.eager_load
设置回其原始值。