tutorial rails que ejemplos curso aprender ruby-on-rails ruby ruby-on-rails-3

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

  1. confía en la carga automática
  2. 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.