67 votes

Ruby on Rails 3: "incompatibilité super-classe pour la classe ..."

Plate-forme: Mac OSX 10.6

Dans mon terminal, je lance la console Ruby avec "rails c"

Tout en suivant le tutoriel Ruby on Rails 3 pour construire une classe:

 class Word < String 
  def palindrome? #check if a string is a palindrome
    self == self.reverse
  end
end
 

je reçois le message d'erreur:

 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>'
 

Le tutoriel montre qu'il n'a pas de problème et je sais que le code va bien; J'ai cherché d'autres questions connexes, mais toutes impliquaient une migration de Ruby 2 vers 3 ou erb vs eruby.

84voto

Douglas F Shearer Points 10422

Vous avez déjà une classe Word définie ailleurs. J'ai essayé dans une application Rails 3 mais je n'ai pas été en mesure de le répliquer.

Si vous n'avez pas créé vous-même une deuxième classe Word , il est probable que l'un de vos gems ou plugins le définit déjà.

25voto

Kris Points 3781

Cela peut aussi arriver en tant que tel:

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

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

class Document < ActiveRecord::Base
  include Geocoder
end
 

Les charges requises Document (avec une superclasse d'objet) avant Document < ActiveRecord::Base (avec une superclasse différente).

Je devrais noter que dans un environnement Rails, le besoin n’est généralement pas nécessaire car il est doté d’un chargement de classe automatique.

20voto

2called-chaos Points 1104

J'ai eu le problème avec une application Rails 4. J'ai utilisé des préoccupations sous l'espace de noms d'utilisateur.

 class User
  module SomeConcern
  end
end
 

En développement, tout a bien fonctionné, mais en production (à cause de preload_app true, je suppose), j'ai eu l'erreur de correspondance. La solution était assez simple. Je viens d'ajouter un initialiseur:

 require "user"
 

À votre santé!

5voto

RebelWarrior Points 21

J'ai eu le même problème en ce moment. En gros, cela signifie que Word est défini en tant que classe ailleurs et je suppose que cela appartient au joyau des traverses ferroviaires. Il suffit de changer Word en Word2 et cela devrait fonctionner correctement dans le tutoriel.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X