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?
Ich habe das gleiche Problem in Schienen 2.3.14/Ruby 1.8.7 – Sukima