【问题标题】:CANCAN => Admin + Agent + UserCANCAN => 管理员 + 代理 + 用户
【发布时间】:2012-09-26 20:48:00
【问题描述】:

需要帮助! :)


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

管理员模型的角色:

  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

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

【问题讨论】:

  • 也许您应该有一个通用模型“用户”并将角色与他们相关联?
  • @code-gijoe 感谢您的评论 - 如上所述,我需要将它们放在不同的表中。
  • 您能解释一下为什么您需要将每个角色放在不同的表中吗?我认为这将有助于我们更好地回答您的问题。 @code-gijoe 在他的回答中对单表继承(或多态关联)的引用是最好的方法,它将允许您为每个角色拥有单独的模型类。但也许我们遗漏了有关您的用例和需求的一些细节?

标签: ruby-on-rails cancan


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    用户模型将包含所有角色所需的信息(电子邮件、密码、姓名、角色),而每个角色的模型将包含特定于该角色的信息。 这样,您可以按照 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

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

    【讨论】:

    • 感谢给我写这个,概念是不同的,我只是想知道如何在这里初始化不同的角色 - def initialize(user)跨度>
    • 是的,我明白了。我试图告诉您的是,您不需要为每个角色使用单独的模型。事实上,CanCan 的设计初衷并非如此。我知道这与您现在所做的不同,但在我看来,这是一种更好的方法,可以解决您的问题。
    猜你喜欢
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多