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。

Matthew Chan asked 2019-11-08T15:24:28Z
5个解决方案
71 votes

您已经在其他地方定义了Word类。 我在Rails 3应用程序中尝试过,但无法复制。

如果您自己还没有创建第二个Word类,则可能是您的Gems或插件之一已经定义了它。

Douglas F Shearer answered 2019-11-08T15:24:57Z
24 votes

也可能会这样发生:

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

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

class Document < ActiveRecord::Base
  include Geocoder
end

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

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

Kris answered 2019-11-08T15:25:37Z
17 votes

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

class User
  module SomeConcern
  end
end

在开发中一切正常,但在生产中(由于preload_app为真,我猜错了)。 解决方法非常简单。 我刚刚添加了一个初始化程序:

require "user"

干杯!

2called-chaos answered 2019-11-08T15:26:12Z
6 votes

我现在有同样的问题。 基本上,这意味着Word被定义为其他地方的类,而我的猜测是它在铁路上。 只需将Word更改为Word2,它就可以在本教程中正常工作。

RebelWarrior answered 2019-11-08T15:26:38Z
3 votes

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

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

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

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

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

# 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. 总是对每个开放类发生继承。
lulalala answered 2019-11-08T15:27:48Z
translate from https://stackoverflow.com:/questions/5512023/ruby-on-rails-3-superclass-mismatch-for-class