que - Ruby on Rails 3: "desajuste entre las clases de la clase..."
ruby on rails tutorial (5)
Algunas veces ''abrimos clases'' sin que lo sepamos. Por ejemplo, con algunos anidamientos de módulos profundos:
# 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 disparador, abrimos la clase SpaceGun existente. Esto funciona. Sin embargo, si cargamos los dos archivos en el orden inverso, se generaría 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, un desencadenador) 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
Ya sea
- confía en la carga automática
- siempre pon herencia a cada aparición de clase abierta.
Plataforma: Mac OSX 10.6
En mi terminal, inicio la consola Ruby con "rails c"
Mientras sigues el tutorial de Ruby on Rails 3 para construir una clase:
class Word < String
def palindrome? #check if a string is a palindrome
self == self.reverse
end
end
recibo el mensaje de error:
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>''
El tutorial muestra que no tiene ningún 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.
Esto también puede suceder así:
# /models/document/geocoder.rb
class Document
module Geocoder
end
end
# /models/document.rb
require ''document/geocoder''
class Document < ActiveRecord::Base
include Geocoder
end
El requerimiento carga el Document
(que tiene una superclase de objeto) antes del Document < ActiveRecord::Base
(que tiene una superclase diferente).
Debo señalar que en un entorno de Rails, por lo general, no es necesario, ya que tiene carga de clase automática.
Tenía el mismo problema ahora mismo. 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.
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 desarrollo, todo funcionó bien pero en producción (supongo que debido a preload_app true) obtuve el error de desajuste. La solución fue bastante simple. Acabo de agregar un inicializador:
require "user"
¡Aclamaciones!
Ya tiene una clase de 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 de Word
usted mismo, es probable que una de sus Gemas o complementos ya lo defina.