繁体   English   中英

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

[英]CANCAN => Admin + Agent + User

需要帮忙! :)


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

管理员模型的角色:

  1. 超级管理员
  2. 管理员

管理员可以创建两个角色,也可以创建“代理”


代理可以创建“用户”,但是他将不能创建“代理”,并且他不应看到其他代理创建的用户。 他只有一个角色-“代理商”


现在的问题是:如何在Ability中初始化“ admin”,“ agent”和“ user”,因为它们是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

注意:用户在代理下,而代理在管理员下。我需要他们是不同的模型

好吧,我建议您在“用户”等基本模型中定义角色。 然后使用来创建用户层次结构。 您的模型应该初始化角色。 假设您创建了一个用户,则角色应类似于: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

您需要的是嵌套属性 ,它使您可以拥有一个单独的用户模型,并为每种类型的用户使用单独的模型(如果您的各种角色在他们所需的信息类型上有很大不同,那就是)。 例如,代理商可能具有教育程度,领域或地区以及个人网站属性,而普通用户则具有公司,最喜欢的报价以及其他内容。

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

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

注意:这些预告片是专门用于实现问答功能的,但是它们讲授的概念可以直接应用于您的情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM