Подтвердить что ты не робот

Ruby on Rails 3: "несоответствие суперкласса для класса..."

Платформа: 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/[email protected]/gems/railties-3.0.5/lib/rails/commands/console.rb:44:in `start'
    from /Users/matthew/.rvm/gems/[email protected]/gems/railties-3.0.5/lib/rails/commands/console.rb:8:in `start'
    from /Users/matthew/.rvm/gems/[email protected]/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.

4b9b3361

Ответ 1

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

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

Ответ 2

Это также может случиться как таковое:

# /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 (который имеет другой суперкласс).

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

Ответ 3

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

class User
  module SomeConcern
  end
end

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

require "user"

Ура!

Ответ 4

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

Ответ 5

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

# 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

Либо

  • полагаться на автоматическую загрузку
  • всегда помещает наследование в каждое событие открытого класса.