2010-12-07 7 views
5

Object#is_a? está fallando en la forma más extraña en Rails 3. Tengo una sola mesa-herencia establecido de la siguiente manera (simplificado por razones de brevedad):is_a? falla con la herencia de una sola mesa en Rails 3

# resource.rb 
class Resource < ActiveRecord::Base 
    # blah blah 
end 

# video.rb 
class Video < Resource 
    # blah blah 
end 

En mi controlador, tengo esto:

def create 
    @resource = Resource.find params[:resource_id] 
    logger.info '@resource class: ' + @resource.class.name 
    logger.info '@resource superclass: ' + @resource.class.superclass.name 
    logger.info '@resource is_a?(Video): ' + @resource.is_a?(Video).inspect 
    logger.info '@resource is_a?(Resource): ' + @resource.is_a?(Resource).inspect 
    logger.info '@resource is_a?(ActiveRecord::Base): ' + @resource.is_a (ActiveRecord::Base).inspect 
    # Do some other stuff 
end 

Invocando la acción #create genera estos resultados del registro:

@resource class: Video 
@resource superclass: Resource 
@resource is_a?(Video): true 
@resource is_a?(Resource): false 
@resource is_a?(ActiveRecord::Base): true 

Tenga en cuenta que la instancia Videoes una ActiveRecord::Base, sin embargo, no es a Resource. Esto no es solo una preocupación académica. El código de Framework llamado desde la acción usa is_a? para verificar la discrepancia de tipo, y aumenta cuando cree que el Video no es un Resource.

Sin embargo, en la consola de Rails, is_a?(Resource) devuelve verdadero.

¿Qué demonios podría estar pasando aquí?

+0

He notado este mismo problema en los carriles 2.3.14/ruby ​​1.8.7 – Sukima

Respuesta

2

La solución aparentemente es reiniciar el proceso del servidor de Rails. No sé cómo se deslizó este error, pero lo hizo. Y lo que es más, ha sucedido en múltiples ocasiones en varias computadoras.

Por lo tanto, para cualquier otra persona que experimente este problema, simplemente reinicie su servidor. Sea lo que sea, es efímero.

+0

Acabo de tropezar con este problema, y ​​el comentario lo solucionó. ¿Este problema se reporta como un error? – pwnall

+0

Por cierto, esto sucede porque su modelo principal (Recurso) se vuelve a cargar, pero el modelo que hereda de él (Video) no lo está. – pwnall

+0

Este comentario no ayudó con los carriles 2.3.14 y ruby ​​1.8.7. – Sukima

0

¿El registro que encontró tiene Video en su columna type?

Al buscar en la colección de superclase encontrarán objetos de subclase, y supongo que aunque buscó explícitamente la colección Resource, el objeto real que encontró fue Video.

¡Sin embargo, no hay idea de la discrepancia en la consola de Rails! Raíles anula is_a? para ActiveSupport::TimeWithZone, pero en sus rieles caso no debería ser ningún Munging nombres de clase o cualquier cosa ...

Tal vez has usado diversas identificaciones en la consola y en su controlador?

+0

Sí, tiene Video en su columna de tipo. Es por eso que se crea una instancia como un video. Pero me parece que cada Video debe ser un Recurso - Rieles o no, sigue siendo la herencia de Ruby. El video es una subclase de Recurso e is_a? mira las superclases Y sí, lo intenté con los mismos ID en la consola y el controlador. – rlkw1024

+0

Además, supongo que no tiene nada que ver con TimeWithZone, ya que la definición de clase de is_a? no se usaría aquí. – rlkw1024

Cuestiones relacionadas