ruby-on-rails – 在Rails 3.2应用程序中使用多个模型时,如何处理Devise的身份验证

我正在使用Rails 3.2应用程序,我使用Devise进行身份验证.我决定尝试单表继承来管理用户角色,但是我很快遇到了一个问题.我目前有三个用户模型,ActiveRecord,Admin<用户和协作者<用户.管理员和协作者共享大多数用户列,但它们的行为和权限略有不同.我的型号目前看起来像这样:
class User < ActiveRecord::Base

  devise :database_authenticatable,:registerable,:recoverable,:rememberable,:trackable,:validatable,:token_authenticatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email,:name,:password,:password_confirmation,:remember_me

  before_save :ensure_authentication_token

  [...]

end

class Admin < User
  has_one :account,dependent: :destroy 
  attr_accessible :account_attributes 
  accepts_nested_attributes_for :account
end


class Collaborator < User
  has_one :account
end

class Account < ActiveRecord::Base
  attr_accessible :name
  validates_presence_of :name 
  has_many :projects,dependent: :destroy
  has_many :users
end

当我尝试在我的ProjectController(以及需要身份验证的其他控制器)中验证管理员和协作者时,遇到问题:

# Causes problem,no one can access anything.
before_filter :authenticate_admin!
before_filter :authenticate_collaborator!

一个类似的问题,我是与设计的帮助方法为ie. current_user,现在我有current_admin和current_collaborator,我通过创建一个以前的过滤器和方法来“解决”:

def set_current_user
  @current_user = current_admin || current_collaborator
end

有没有类似或简单的解决方案我的身份验证问题与Devise,或者你会推荐另一种方法比单表继承,这将是什么?

我的目标是,1.当新用户注册时,他们成为管理员,当他们创建帐户时,还会创建一个帐户模型. 2.新的(管理员)用户可以邀请其他用户到帐户,这将是协作者.管理员和协作者应该有不同的权限.合作者不会在注册时创建新的“帐户”(公司可能是我的帐户模型更好的名称),因此管理员和协作者将需要稍微不同的注册和编辑表单.

谢谢.

更新

我有一个解决”它通过创建一个类似的过滤器之前:

def authenticate!
  if @current_user == current_admin
    :authenticate_admin!
  elsif @current_user == current_collaborator
    :authenticate_collaborator!
  end
end

关于可能更优雅的解决方案的建议仍然不胜感激.

解决方法

您可以使用以下解决方解决此问题
def authenticate!
    if modelA_user_signed_in?
      @current_user = current_modelA
      true
    else
      authenticate_modelB!
    end

  end

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...