6

Object#is_a?在 Rails 3 中以最奇怪的方式失败。我的单表继承设置如下(为简洁起见):

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

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

在我的控制器中,我有这个:

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

调用该#create操作会生成以下日志结果:

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

请注意,该Video实例一个ActiveRecord::Base,但它不是一个Resource。这不仅仅是一个学术问题。从操作调用的框架代码is_a?用于检查类型不匹配,当它认为Video不是Resource.

然而在 Rails 控制台中,is_a?(Resource)返回 true。

这里到底发生了什么?

4

2 回答 2

3

The solution is apparently to restart the Rails server process. I don't know how this error crept in, but it did. And what's more, it has happened on multiple occasions on multiple computers.

So, to anyone else experiencing this problem, just restart your server. Whatever it is, it's ephemeral.

于 2010-12-07T22:51:48.173 回答
0

Does the record you found have Video in its type column?

Searching on the superclass collection will find subclass objects, and I guess that even though you explicitly searched the Resource collection, the actual object you found was a Video.

No idea what the discrepancy is in the Rails console though! Rails overrides is_a? for ActiveSupport::TimeWithZone, but in your case Rails shouldn't be munging any class names or anything...

Maybe did you use different ids in the console and in your controller?

于 2010-12-07T22:35:18.320 回答