CANCAN =>管理员+代理+用户

时间:2012-09-26 20:48:00

标签: ruby-on-rails cancan

需要帮助! :)


用例: 管理员可以在具有“SuperAdmin”角色时创建另一个管理员,管理员也可以创建“代理”

管理模型的角色:

  1. 超级管理员
  2. 管理
  3. 管理员可以创建两个角色,可以创建“代理”


    代理可以创建“用户”,但他无法创建“代理”,也不应该看到其他代理创建的用户。他只有一个角色 - “代理人”


    现在的问题是:如何初始化“admin”,“agent”&能力中的“用户”是3种不同的模型吗?

    class Ability
      def initialize(user)
        user ||= User.new # guest user (not logged in)
        can :read, Photo, Photo.unowned do |photo|
          photo.groups.empty?
        end
      end
    end
    

    注意:用户在Agent下,Agent在Admin下。我需要它们是不同的模型

2 个答案:

答案 0 :(得分:2)

好吧,我建议你在像'User'这样的基础模型中定义你的角色。然后使用this创建用户层次结构。您的模型应该初始化角色。假设您创建了一个User,那么该角色应该是:user。尝试执行操作的任何用户(如果您的控制器都已明确定义)将通过“初始化”。

initialize方法不是初始化角色,而是初始化该特定角色的规则。

class Ability
   def initialize(user)
      user ||= User.new # guest user (not logged in)

      if user.role == :admin
         can :read, Photo, Photo.unowned do |photo|
           photo.groups.empty?
      elsif user.role == :agent 
         # rules for agents
      else
         # rules for others
      end
  end
end

答案 1 :(得分:0)

您需要的是嵌套属性,这将允许您为每种类型的用户提供单独的用户模型和单独的模型(如果您的各种角色在他们需要的信息类型上有很大差异, 那是)。例如,代理商可能拥有教育,领域或地区以及个人网站属性,而普通用户拥有公司,最喜欢的报价以及其他任何内容。

用户模型将包含所有角色所需的信息(电子邮件,密码,名称,角色),而每个角色的模型将具有特定于该角色的信息。 这样,您可以按照CanCan的文档进行授权,但仍然拥有特定于角色的信息。

在nested_attributes上有一个很棒的railscast: http://railscasts.com/episodes/196-nested-model-form-part-1(第1部分)和 http://railscasts.com/episodes/197-nested-model-form-part-2

注意:这些视频直播剧集专门用于制作问答功能,但他们所教授的概念可以直接适用于您的情况。