Ruby on Rails 3:“类的超类不匹配......”

时间:2011-04-01 10:20:22

标签: ruby-on-rails ruby ruby-on-rails-3

平台: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迁移到3或erb vs eruby。

5 个答案:

答案 0 :(得分:68)

您已在其他位置定义了Word类。我在Rails 3应用程序中尝试但无法复制。

如果您自己没有创建第二个Word课程,很可能您的某个宝石或插件已经定义了它。

答案 1 :(得分:22)

这也可以这样发生:

# /models/document/geocoder.rb
class Document
  module Geocoder
  end
end

# /models/document.rb
require 'document/geocoder'

class Document < ActiveRecord::Base
  include Geocoder
end

需求在Document(具有不同的超类)之前加载Document < ActiveRecord::Base(具有Object的超类)。

我应该注意,在Rails环境中,通常不需要require,因为它有自动类加载。

答案 2 :(得分:17)

我遇到了Rails 4应用程序的问题。我在用户命名空间下使用了关注点。

class User
  module SomeConcern
  end
end

在开发过程中一切正常,但在生产中(我猜因为preload_app为true)我得到了不匹配错误。修复非常简单。我刚刚添加了一个初始化程序:

require "user"

干杯!

答案 3 :(得分:6)

我现在遇到同样的问题。基本上这意味着Word被定义为其他地方的一个类,我的猜测是它在轨道宝石上。只需将Word更改为Word2,它应该在本教程中正常工作。

答案 4 :(得分:3)

有时我们在没有我们知情的情况下“开课”。例如,使用一些深层模块嵌套:

# space_gun.rb
class SpaceGun << Weapon
  def fire
    Trigger.fire
  end
end

# space_gun/trigger.rb
class SpaceGun
  class Trigger
  end
end

当我们定义触发器时,我们打开现有的SpaceGun类。这有效。 但是,如果我们以相反的顺序加载这两个文件,则会引发错误,因为我们首先定义一个SpaceGun类,但不是武器。

有时我们会犯这个错误,因为我们明确要求来自父类的子模块(例如触发器)。这意味着类定义将以相反的顺序完成,从而导致此问题。

# surely nothing can go wrong if we require what we need first right?
require 'space_gun/trigger'
class SpaceGun << Weapon
  def fire
    Trigger.fire
  end
end
# BOOM

无论

  1. 依靠自动加载
  2. 总是将继承放在每个公开的类中。