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

解決策は、明らかにRailsサーバープロセスを再起動することです。このエラーがどのように発生したかはわかりませんが、発生しました。さらに、それは複数のコンピューターで何度も発生しています。

したがって、この問題が発生している他の人には、サーバーを再起動するだけです。それが何であれ、それは一時的なものです。

于 2010-12-07T22:51:48.173 に答える
0

あなたが見つけたレコードVideoはそのtype列にありますか?

スーパークラスコレクションを検索するとサブクラスオブジェクトが見つかります。Resourceコレクションを明示的に検索しても、実際に見つかったオブジェクトはでしたVideo

ただし、Railsコンソールの不一致が何であるかはわかりません。Railsはをオーバーライドis_a?しますActiveSupport::TimeWithZoneが、あなたの場合、Railsはクラス名などを変更するべきではありません...

たぶん、コンソールとコントローラーで異なるIDを使用しましたか?

于 2010-12-07T22:35:18.320 に答える