2010-12-07 10 views
5

Object#is_a? wird auf die seltsamste Weise in Rails versagt 3. Ich Single-Table-Vererbung eingerichtet haben wie folgt (der Kürze halber vereinfacht):is_a? nicht mit Vererbung Single-Table in Rails 3

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

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

In meinem Controller, ich habe dies:

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 

Aufrufen der #create Aktion generiert diese Protokoll Ergebnisse:

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

Beachten Sie, dass die Video -Instanz eine ActiveRecord::Base ist, aber es ist nicht eine Resource. Dies ist nicht nur ein akademisches Anliegen. Framework-Code, der von der Aktion aufgerufen wird, verwendet is_a?, um nach einem Typenkonflikt zu suchen, und er wird ausgelöst, wenn er denkt, dass Video kein Resource ist.

In der Rails-Konsole gibt is_a?(Resource) True zurück.

Was in der Welt könnte hier vor sich gehen?

+0

Ich habe das gleiche Problem in Schienen 2.3.14/Ruby 1.8.7 – Sukima

Antwort

2

Die Lösung besteht offenbar darin, den Rails-Server-Prozess neu zu starten. Ich weiß nicht, wie sich dieser Fehler eingeschlichen hat, aber es ist passiert. Und mehr noch, es ist mehrfach auf mehreren Computern passiert.

Also, für alle anderen, die dieses Problem haben, starten Sie einfach Ihren Server neu. Was auch immer es ist, es ist vergänglich.

+0

Ich bin gerade auf dieses Problem gestoßen, und der Kommentar hat es behoben. Wird dieses Problem als Fehler gemeldet? – pwnall

+0

Dies geschieht übrigens, weil Ihr übergeordnetes Modell (Ressource) neu geladen wird, aber das Modell, das von ihm erbt (Video) nicht. – pwnall

+0

Dieser Kommentar half nicht mit Rails 2.3.14 und Ruby 1.8.7. – Sukima

0

Hat der gefundene Datensatz Video in seiner Spalte type?

Suche in der Superklasse Sammlung finden Unterklasse Objekte, und ich denke, dass, obwohl Sie explizit die Resource Sammlung suchten, das eigentliche Objekt, das Sie gefunden haben, war ein Video.

Keine Ahnung, was die Diskrepanz in der Rails-Konsole ist! Schienen überschreibt is_a? für ActiveSupport::TimeWithZone, aber in Ihrem Fall sollte Schienen keine Klassennamen oder irgendetwas ...

haben Vielleicht verwendeten Sie unterschiedliche IDs in der Konsole und in Ihrem Prüfer?

+0

Ja bemerkt, es hat Video in seiner Spalte Typ. Deshalb wird es als Video instanziiert. Aber es scheint mir, dass jedes Video eine Ressource sein sollte - Rails oder nicht, es ist immer noch Ruby Vererbung. Video ist eine Unterklasse von Resource und is_a? Betrachtet Superklassen. Und ja, ich habe es mit genau den gleichen IDs in der Konsole und im Controller versucht. – rlkw1024

+0

Ich nehme auch nicht an, dass es etwas mit TimeWithZone zu tun hat, da die Definition der Klasse von is_a? würde hier nicht verwendet werden. – rlkw1024