4

我正在尝试在我的 Rails 应用程序中为 User 模型及其子类 Member、Subscriber 和 Staff 设置单表继承。

我有每个模型文件:user.rb、member.rb 等

定义了用户模型:class User < ActiveRecord::Base; end; 我将其他模型子类化为:class Member < User; end;等等。

在我的用户表中,我有每个类需要的所有字段以及类型字段。现在,当我转到控制台并尝试创建说成员或订阅者的新实例时,我收到以下错误:

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

我从一个草稿应用程序开始尝试站在我这边,它可以工作

这是我的用户模型(User.rb)

class User < ActiveRecord::Base
end

我的会员模型 (Member.rb)

class Member < User
end

我有一个迁移文件来创建我的用户表,其中包含:

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.string :name
      t.timestamps
    end
  end

  def self.down
    drop_table :users
  end
end

现在启动控制台:

➜  ./script/console     
Loading development environment (Rails 2.3.4)
>> u = User.new
=> #<User id: nil, name: nil, created_at: nil, updated_at: nil>
>> m = Member.new
=> #<Member id: nil, name: nil, created_at: nil, updated_at: nil>
>> m.name="hop"
=> "hop"
>> m.save
=> true

但是我没有设法重现您的错误:(

于 2009-10-16T20:40:04.960 回答
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 回答
1

检查这个页面,这个问题有很多解决方案(即使在评论中)。

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

于 2010-08-21T07:10:19.927 回答
0

在我将一些功能提取到插件之后,我确实遇到了这个问题。

但我的情况是它从控制台工作,所以我确保重新加载了 id,并在 init.rb 中使用了这一行 ActiveSupport::Dependencies.load_once_paths.delete( File.expand_path(File.dirname(__FILE__))+'/app/models')

于 2009-11-19T23:12:51.893 回答
0

由于您显示的堆栈跟踪,我认为问题出在您的模型定义之一中。如果你仍然有问题,粘贴你的代码,我相信你会得到一个好的答案。

于 2009-11-01T03:06:04.243 回答
0

不久前我遇到了类似的事情,这个网站提供了帮助:

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

class User < ActiveRecord::Base
  unloadable

  ...
end

不知道为什么会发生这种情况,因为我无法追踪任何异常情况。我确实相信这是一种性传播感染的情况。

于 2010-01-08T20:58:52.880 回答