【问题标题】:How to integrate CanCan with multiple devise models?如何将 CanCan 与多个设计模型集成?
【发布时间】:2012-06-18 18:25:45
【问题描述】:

我将如何定义多个设计模型的能力?

【问题讨论】:

    标签: ruby-on-rails devise cancan


    【解决方案1】:

    假设您的应用有两个独立的 Devise 用户模型,分别称为 UserAdmin。这意味着您可以并排使用current_usercurrent_admin 之类的方法。

    让我们进一步假设您只有/想要一个 Ability 类,其中包含您所有的 CanCan 权限设置...

    class Ability
      include CanCan::Ability
    
      def initialize(user)
        user ||= User.new
        case user
        when User
          can :create, Comment
          can :read, :all
        when Admin
          can :manage, :all
        end
      end
    end
    

    这正是其他人提出的建议,但您还需要采取另一个步骤。

    默认情况下,CanCan 假定方法 current_user 存在,并将返回一个用户对象以与您的 Ability 设置进行比较。但是,可以使用current_admin 找到我们的管理员用户。如果不告诉 CanCan 在哪里可以找到管理对象,它们就永远不会被审查,因此永远不会获得权限; 在与管理员打交道时,我们必须更改默认设置。

    将以下内容添加到application_controller.rb...

    def current_ability
      if admin_signed_in?
        @current_ability ||= Ability.new(current_admin)
      else
        @current_ability ||= Ability.new(current_user)
      end
    end
    

    现在我们的 Ability 类将查看 Admin 对象(如果可用),并在没有可用时返回普通用户。

    进一步的开发允许我们将管理员权限转移到他们自己单独的能力类中......

    def current_ability
      if admin_signed_in?
        @current_ability ||= AdminPowers.new(current_admin)
      else
        @current_ability ||= Ability.new(current_user)
      end
    end
    

    有关详细信息,请参阅 Wiki 中的 Changing Defaults。感谢Stefan 为我指出正确的文章。

    仅供参考 - CanCan 已死,万岁CanCanCan 更新了错误修复和新功能。相同的命名空间,所以它只是 Gemfile 中的一个插入式 gem 替换。

    gem 'cancancan', '~> 1.8'
    

    【讨论】:

    • 搜索后终于找到了完整的答案
    【解决方案2】:

    这对我有用 -

    class Ability
      include CanCan::Ability
    
      def initialize(user)
        if user.is_a?(Admin)
          can :manage, :all
        elsif user.is_a?(User)
          can :create, Comment
          can :read, :all
        else
          can :read, :all
        end
      end
    end
    

    【讨论】:

      【解决方案3】:

      当前用户模型被传递给Ability#initialize,所以你可以检查它的类:

      class Ability
        include CanCan::Ability
      
        def initialize(model)
          case model
          when Admin
            can :manage, :all
          when User
            can :create, Comment
            can :read, :all
          else
            can :read, :all
          end
        end
      end
      

      【讨论】:

      • 谢谢斯特凡。不幸的是,它似乎不起作用。它仅适用于用户案例,其他但不适用于管理员。每当我以管理员身份登录时,我只有访客权限。可能我做错了什么,但我想不通。
      • 可能没有为您的管理员调用 Ability#initialize。添加一些日志记录并查看Changing Defaults
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多