Ответ 1
У вас уже есть класс Word
, определенный в другом месте. Я попытался в Rails 3, но не смог реплицировать.
Если вы не создали второй Word
класс самостоятельно, вероятно, один из ваших Gems или плагинов уже определяет его.
Платформа: 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.
У вас уже есть класс Word
, определенный в другом месте. Я попытался в Rails 3, но не смог реплицировать.
Если вы не создали второй Word
класс самостоятельно, вероятно, один из ваших Gems или плагинов уже определяет его.
Это также может случиться как таковое:
# /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 требование обычно не требуется, поскольку оно имеет загрузку автоклава.
У меня возникла проблема с приложением Rails 4. Я использовал проблемы в пространстве имен пользователей.
class User
module SomeConcern
end
end
В разработке все работало нормально, но в производстве (я думаю, из-за preload_app true) я получил ошибку несоответствия. Исправление было довольно простым. Я просто добавил инициализатор:
require "user"
Ура!
У меня была эта же проблема прямо сейчас. В основном это означает, что Word определяется как класс в другом месте, и я предполагаю, что это на жемчужине железнодорожных связей. Просто измените Word на Word2, и он должен хорошо работать в учебнике.
Иногда мы открываем класс, не зная нас. Например, с некоторой глубиной вложенности модулей:
# 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
Либо