6

我正在使用 rails 3.0.9、cancan 1.6.7 并设计 1.4.8

我正在使用两个设计模型(用户和管理员)进行不同的登录和注册过程

所以我想根据登录用户(资源)来划分能力,因为有 70 多个模型,两种类型的用户只有 10 个模型是通用的(这里 50 多个模型和视图仅供管理员用户使用)

我想实现两个能力类(UserAbility 和 AdminAbility),并且设计辅助方法 current_user/current_admin 应该传递给 UserAbility/AdminAbility

例子:

在 ApplicationController.rb 文件中

    def current_ability
        if current_user
            @current_ability = UserAbility.new(current_user)
        elsif current_admin
            @current_ability = AdminAbility.new(current_admin)
        end
    end

从上面我的问题,

  1. 在cancan中是否可以使用多种能力类,如果可能,那么如何创建它,因为我尝试过

    rails g cancan:user_ability

    但我收到错误,因为找不到生成器 cancan:user_ability

  2. 如何为登录的用户/管理员选择合适的能力等级。

  3. 如果用户和管理员都访问了控制器,那么如何获取当前登录的用户/管理员的对象

有没有其他解决方案?

任何人请帮助解决这个问题

4

4 回答 4

13

...也就是说,如果您愿意,可以直接使用多种能力模型:

class UserAbility
  include CanCan::Ability

  def initialize(user)
    can :read, :all
  end
end

class AdminAbility
  include CanCan::Ability

  def initialize(admin)
    can :manage, :all
  end
end

class ApplicationController < ActionController::Base
  # overriding CanCan::ControllerAdditions
  def current_ability
    if current_account.kind_of?(AdminUser)
      @current_ability ||= AdminAbility.new(current_account)
    else
      @current_ability ||= UserAbility.new(current_account)
    end
  end
end
于 2012-10-05T14:36:15.393 回答
7

您不需要多个能力课程:

class Ability
  include CanCan::Ability

  def initialize(user_or_admin)
    user_or_admin ||= User.new

    common_rules(user_or_admin)

    if user_or_admin.kind_of? Admin
      admin_rules(user_or_admin)
    else
      user_rules(user_or_admin)
    end
  end

  def common_rules(user_or_admin)
    # can :verb, :noun
  end

  def admin_rules(admin)
    can :manage, :all
  end

  def user_rules(user)
    can :read, :all
  end
end

CanCan 最终将Ability.new()使用任一模型调用,但这很好,因为您可以检查收到的对象类型。当然,如果您愿意,您可以委托给其他对象;这一切都只是红宝石。

于 2012-10-05T14:29:23.310 回答
1

我已经实现了@willgiynn解决方案的一部分,修改了application_controller.rbcurrent_ability中的方法。

能力.rb上:

class UserAbility
  include CanCan::Ability

  def initialize(user)
    can :read, :all
  end
end

class AdminAbility
  include CanCan::Ability

  def initialize(admin)
    can :manage, :all
  end
end

application_controller.rb上

def current_ability
  @current_ability ||= current_admin ? AdminAbility.new(current_admin) : UserAbility.new(current_user)
end

希望能帮助到你!

于 2020-05-10T21:31:46.753 回答
0

我会补充一下willgiynn 的回答。看来我必须添加更多代码才能使其正常工作。我从这篇文章中找到了答案

将以下内容添加到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
于 2015-06-14T08:30:00.437 回答