我正在尝试用cancan gem解决用户的能力问题。 公司和用户通过user_company_assignment关联,公司有很多用户,用户拥有并属于许多公司 我想将公司的展示行动仅限于与公司相关的用户。下面是两个模型的代码和一个带有初始化角色继承的ability.rb的剪辑和卖方用户的方法,但这不起作用,它向我展示了公司的详细信息。
Company.rb
has_many :user_company_assignments
has_many :user, :through => :user_company_assignments
User.rb
has_many :user_company_assignments
has_many :companies, :through => :user_company_assignments
Ability.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
答案 0 :(得分: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
答案 1 :(得分:0)
您需要在控制器中调用load_and_authorize_resource
方法。
答案 2 :(得分:0)
好的jesper,我已经改变了我的能力.rb并且它有效,但我不确定这是设置能力的最佳方法,我很需要指定卖家有权获得的每个模型表演行动。告诉我这是否是最好的方法:
Ability.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