4

Rails アプリで User モデルとそのサブクラスの Member、Subscriber、および Staff に対して単一テーブルの継承を設定しようとしています。

それぞれのモデル ファイルがあります: user.rb、member.rb など

ユーザーモデルが定義されています:class User < ActiveRecord::Base; end; 私は他のモデルをサブクラス化しました: などclass Member < User; end;

私の users テーブルには、すべてのクラスが必要とするすべてのフィールドと type フィールドがあります。コンソールに移動して、たとえばメンバーまたはサブスクライバーの新しいインスタンスを作成しようとすると、次のエラーが発生します。

TypeError: can't dup NilClass from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.4/lib/active_record/base.rb:2184:in 'dup' from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.4/lib/active_record/base.rb:2184:in 'scoped_methods' from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.4/lib/active_record/base.rb:2188:in 'current_scoped_methods' from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.4/lib/active_record/base.rb:2171:in 'scoped?' from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.4/lib/active_record/base.rb:2439:in 'send' from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.4/lib/active_record/base.rb:2439:in 'initialize' from (irb):6:in 'new' from (irb):6

Rails は、サブクラス モデルがそこにあることを認識しています。これは、コンソールで単に Member または Subscriber を呼び出すと、クラス定義が返されるためです。

簡単なドキュメントを読みましたが、何か足りないのでしょうか?

4

6 に答える 6

1

このページを確認してください。この問題の解決策はいくつかあります (コメントにもあります)。

http://strd6.com/2009/04/cant-dup-nilclass-maybe-try-unloadable/

于 2010-08-21T07:10:19.927 に答える
1

タイプ varchar (Ruby の文字列) のタイプ列はありますか? 次のコマンドを試してください (新しい Rails プロジェクトで)

class Member < User
end

C:\projects\test\sti>ruby script\generate model user name:string type:string membertype:string
  exists  app/models/
  exists  test/unit/
  exists  test/fixtures/
  create  app/models/user.rb
  create  test/unit/user_test.rb
  create  test/fixtures/users.yml
  create  db/migrate
  create  db/migrate/20091019051506_create_users.rb

C:\projects\test\sti>rake db:migrate
(in C:/projects/test/sti)
==  CreateUsers: migrating ====================================================
-- create_table(:users)
   -> 0.0000s
==  CreateUsers: migrated (0.0000s) ===========================================


C:\projects\test\sti>ruby script\console
Loading development environment (Rails 2.3.4)
>> u = User.new
=> #<User id: nil, name: nil, type: nil, membertype: nil, created_at: nil, updated_at: nil>
>> m = Member.new
=> #<Member id: nil, name: nil, type: "Member", membertype: nil, created_at: nil, updated_at: nil>
>> m.name = 'fred'
=> "fred"
>> m.save
=> true
>> u.name = 'rader'
=> "rader"
>> u.save
=> true
>> User.find :all
=> [#<Member id: 1, name: "fred", type: "Member", membertype: nil, created_at: "2009-10-19 05:17:11", updated_at: "2009-10-19 05:17:11">, #<User id: 2, name: "rader", type: nil, membertype: nil, created_at: "2009-10-19 05:17:24", updated_at: "2009-10-19 05:17:24">]
>>
于 2009-10-19T05:36:13.057 に答える
0

私はしばらく前に似たようなことに遭遇し、このウェブサイトが役に立ちました:

http://www.dansketcher.com/2009/05/11/cant-dup-nilclass/

class User < ActiveRecord::Base
  unloadable

  ...
end

異常を追跡できなかったため、なぜこれが発生するのかわかりません。私はそれがSTIの状況だったと信じています。

于 2010-01-08T20:58:52.880 に答える
0

あなたが示しているスタック トレースのために、モデル定義の 1 つに問題があると考えています。それでも問題が解決しない場合は、コードを貼り付けてください。適切な回答が得られると確信しています。

于 2009-11-01T03:06:04.243 に答える
0

プラグインにいくつかの機能を抽出した後、私はまさにこの問題を抱えていました。

しかし、私の場合はコンソールから機能したので、init.rbにこの行を追加して、IDをリロードしたことを確認しました ActiveSupport::Dependencies.load_once_paths.delete( File.expand_path(File.dirname(__FILE__))+'/app/models')

于 2009-11-19T23:12:51.893 に答える