rails和cancan - 如何通过关联限制公司向has_many中的用户所有者显示操作

时间:2013-02-20 11:25:21

标签: ruby-on-rails cancan has-many-through

我正在尝试用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 

3 个答案:

答案 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