0

我正在尝试使用 cancan gem 解决用户的能力问题。公司和用户通过 user_company_assignment 关联,这样公司有很多用户,用户拥有并属于许多公司 下面是两个模型的代码和具有初始化角色继承和卖方用户方法的能力.rb 片段,但这不起作用,它总是向我显示公司详细信息。

公司.rb

has_many :user_company_assignments
has_many :user, :through => :user_company_assignments

用户.rb

has_many :user_company_assignments
has_many :companies, :through => :user_company_assignments

能力.rb

def initialize(user)
  @user = user || User.new # for guest
  @user.roles.each { |role| send(role.name.downcase) }
end

def seller
  can :manage, :all
  cannot :destroy, :all

  can :show, Company do |company|
    company.user_ids.include? @user.id
  end
end 
4

3 回答 3

2

您的错误是由于能力优先:https://github.com/ryanb/cancan/wiki/Ability-Precedence

此行会覆盖以下所有能力:can :manage, :all

由于您已经声明卖方可以管理所有内容,因此卖方可以对公司执行任何类型的操作,而不管其他can声明如何。

一种解决方案是使用cannot,就像您使用:destroy. 它将覆盖该:manage, :all子句。

def seller
  can :manage, :all
  cannot :destroy, :all
  cannot :show, Company do |company|
    !company.user_ids.include? @user.id
  end
end
于 2013-02-20T11:34:28.400 回答
0

您需要load_and_authorize_resource在控制器中调用该方法。

于 2013-02-20T11:31:28.290 回答
0

好的jesper,我已经更改了我的ability.rb并且它可以工作,但我不确定这是设置能力的最佳方法,奇怪的是我需要指定卖家有权执行展示操作的每个模型. 告诉我这是否是最好的方法:

能力.rb

def seller
  can [:index, :create], :all
  cannot :destroy, :all

  can :show, Company do |company|
    company.user_ids.include? @user.id
  end

  can :show, [Report, Client]

end 
于 2013-02-20T11:48:48.050 回答