2011-04-01 10 views
47

Plataforma: Mac OS X 10.6Ruby on Rails 3: "desajuste superclase para la clase ..."

En mi terminal, comienzo a la consola de rubí con carriles "c"

mientras se sigue el rubí en los carriles 3 tutorial para construir una clase:

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

me sale el mensaje de error:

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

el tutorial muestra que no tiene problema y sé que el código está bien; He buscado otras preguntas relacionadas, pero todas involucraron la migración de Ruby 2 a 3 o erb vs eruby.

+0

código está bien – fl00r

Respuesta

62

Ya tiene una clase Word definida en otro lugar. Intenté dentro de una aplicación de Rails 3 pero no pude replicar.

Si no ha creado una segunda clase Word usted mismo, es probable que una de sus gemas o complementos ya la defina.

+2

Gracias, terminé reiniciando la consola. Anteriormente, utilicé un nombre de clase diferente, pero obtuve el mismo error. –

+0

Gracias por la pista sobre gemas o complementos que probablemente estén definiendo la clase. Tuve el problema en una aplicación JRuby 1.7.1 en mi PagesController. Renombrarlo resolvió el problema. – emrass

6

Tuve este mismo problema en este momento. Básicamente eso significa que Word se define como una clase en otro lugar y mi suposición es que está en la gema de los vínculos ferroviarios. Simplemente cambie Word a Word2 y debería funcionar bien en el tutorial.

18

Esto también puede ocurrir como tal:

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

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

class Document < ActiveRecord::Base 
    include Geocoder 
end 

El requiere cargas Document (que tiene una superclase de Object) antes de Document < ActiveRecord::Base (que tiene una superclase diferente).

Debo tener en cuenta que en un entorno de Rails no suele ser necesario, ya que tiene carga de clase automática.

+0

¡Gracias, eso resolvió un gran misterio para mí! –

13

Tuve el problema con una aplicación de Rails 4. Usé las preocupaciones bajo el espacio de nombres de usuario.

class User 
    module SomeConcern 
    end 
end 

En el desarrollo de todo funcionaba bien, pero en la producción (supongo que por cierto preload_app) Tengo el error de falta de coincidencia. La solución fue bastante simple. Acabo de agregar un inicializador:

require "user" 

¡Salud!

+0

¡Eso es lo más frustrante para mí! ¡Ojalá pudiera votarlo más! –

+0

También tengo este problema, ¿puede decirme dónde se agrega 'require 'user''? – JeskTop

+1

@JeskTop simplemente agrega un nuevo archivo a 'config/initializers' con solo ese archivo. Los inicializadores se ejecutan antes de que toda la aplicación se cargue y asegúrese de que la clase de modelo se cargue primero. –

2

A veces 'abren clase' sin que lo sepamos. Por ejemplo, con un módulo de anidamiento profundo:

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

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

Cuando definimos el activador, abrimos la clase SpaceGun existente. Esto funciona. Sin embargo, si cargamos los dos archivos en el orden inverso, se generará el error, porque primero definiríamos una clase SpaceGun, pero no es un Arma.

A veces cometemos este error porque explícitamente requerimos un submódulo (por ejemplo, desencadenante) de la clase principal. Lo que significa que la definición de clase se realizará en el orden inverso, lo que provoca este problema.

# 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 

De cualquier

  1. se basan en la carga automática
  2. herencia siempre pone a cada ocurrencia clase abierta.