Ruby on Rails 3: «несоответствие суперкласса для класса ...» - PullRequest
54 голосов
/ 01 апреля 2011

Платформа: Mac OSX 10.6

В моем терминале я запускаю консоль Ruby с "rails c"

Следуя учебному пособию по 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 ]

69 голосов
/ 01 апреля 2011

У вас уже есть класс Word, определенный в другом месте. Я пытался в приложении Rails 3, но не смог воспроизвести.

Если вы сами не создали второй Word класс, вероятно, один из ваших Gems или плагинов уже определил его.

24 голосов
/ 14 марта 2012

Это также может происходить следующим образом:

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

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

class Document < ActiveRecord::Base
  include Geocoder
end

Требуемые нагрузки Document (с суперклассом Object) до Document < ActiveRecord::Base (с другим суперклассом).

Следует отметить, что в среде Rails требование require обычно не требуется, так как оно имеет автоматическую загрузку классов.

17 голосов
/ 11 марта 2014

У меня была проблема с приложением Rails 4.Я использовал проблемы в пространстве имен пользователя.

class User
  module SomeConcern
  end
end

В разработке все работало нормально, но в процессе производства (думаю, из-за preload_app true) я получил ошибку несоответствия.Исправление было довольно простым.Я только что добавил инициализатор:

require "user"

Ура!

6 голосов
/ 30 октября 2011

У меня была такая же проблема прямо сейчас. По сути, это означает, что Word определен как класс в другом месте, и я предполагаю, что он находится в жемчужине узы. Просто измените Word на Word2, и он должен хорошо работать в учебнике.

3 голосов
/ 13 июля 2016

Иногда мы «открываем уроки» без нашего ведома. Например, для некоторых глубоких модулей:

# 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. всегда помещает наследование в каждое вхождение открытого класса.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...