Rails STI有设计和rolify错误

时间:2013-04-08 11:00:35

标签: ruby-on-rails devise runtime-error sti rolify

我正在使用Devise和Rolify开发Rails 3.2.13应用程序,我需要有3种用户类型,如下所示:

class User < ActiveRecord::Base
  rolify
  ...
end

class UserTypeOne < User
  ....
end

class UserTypeTwo < User
  ....
end

class UserTypeThree < User
  ....
end

当我尝试为我的数据库设定种子时,用户的que创建工作正常,但在尝试向其中任何一个添加角色时会出错:

user = UserTypeOne.find_or_create_by_email :name => 'User one', :email => 'userone@test.com', :password => 'userone', :password_confirmation => 'userone'
user.confirm!
user.add_role :admin

rake aborted!
undefined method `find_or_create_by' for nil:NilClass

但用户插入正确...我做错了什么?

提前致谢!

2 个答案:

答案 0 :(得分:0)

尝试添加

self.adapter = User.adapter 

每个继承的类。

示例:

class UserTypeOne < User
  self.adapter = User.adapter 
  ....
end

这对我有用。

答案 1 :(得分:0)

在ActiveRecord中使用STI时,Rolify只知道查看当前类 而不是父母。

以下是问题: https://github.com/EppO/rolify/issues/138

上面的Ethans答案应该有效,但Here是Rolify常见问题解答中的答案。

就个人而言,我不喜欢这两种解决方案。 也许Rolify可以在继承类时传递适配器。类似的东西:

def self.inherited(klass)
    klass.adapter = self.adapter
    super # EDIT: added super call to prevent ActiveRecord error (NoMethodError: undefined method `synchronize' for nil:NilClass)
end